ワイルドカード * を (bash?) スクリプトに渡す

ワイルドカード * を (bash?) スクリプトに渡す

中程度の大きさのテキスト ファイルのコレクションから、「@n」、「@R」などのすべてのカラー コードを削除したいと考えています。

そこで、「remove_cc」というファイルに次のように記述しました。

sed -ie 's/@r//g' $1
sed -ie 's/@g//g' $1
sed -ie 's/@y//g' $1
sed -ie 's/@b//g' $1
sed -ie 's/@m//g' $1
sed -ie 's/@c//g' $1
sed -ie 's/@n//g' $1
sed -ie 's/@R//g' $1
sed -ie 's/@G//g' $1
sed -ie 's/@Y//g' $1
sed -ie 's/@B//g' $1
sed -ie 's/@M//g' $1
sed -ie 's/@C//g' $1
sed -ie 's/@N//g' $1
sed -ie 's/@W//g' $1
sed -ie 's/@K//g' $1

とにかく、スクリプトは次のように使用すると素晴らしく機能します: ./remove_cc file.txt

しかし、./remove_cc *.txtスクリプトを実行したい txt ファイルが多数あるフォルダーを入力すると、何も実行されません。 ./remove_cc *同様に効果がありません。

これを修正して動作させる方法はありますか?

答え1

と入力すると./remove_cc *、シェルはそれを に変更し./remove_cc file1.txt file2.txt file3.txt etc、そのようにスクリプトを実行します。スクリプトは$1最初のパラメータ (file1.txt) のみを参照します。

これを行う最も一般的な方法は、各パラメータを順番にループすることです。 は "$@"すべてのパラメータのリストに展開され、 を使用してforそれらをループすることができます。

for n in "$@" ; do
    sed -ie 's/@r//g' "$n"
    ...
done

この特定のケースでは、sed複数のファイル名を取るため、次のように簡略化できます。

sed -ie 's/@r//g' "$@"

シェル スクリプトを書くときは、引用符に注意することが重要です。たとえば、引用符がないと、スクリプトは という名前のファイルでは機能しませんMy Text File.txt

答え2

ただ使う

 for x in *
 do
     ./remove_cc $x
 done

ちなみに、すべてのsedを1行にまとめることもできます

sed -i \
    -e 's/@r//g' -e 's/@g//g' -e 's/@y//g' -e 's/@b//g' \
    -e 's/@m//g' -e 's/@c//g' -e 's/@n//g' -e 's/@R//g' \
    -e 's/@G//g' -e 's/@Y//g' -e 's/@B//g' -e 's/@M//g' \
    -e 's/@C//g' -e 's/@N//g' -e 's/@W//g' -e 's/@K//g' \
    $1

sed コマンドをセミコロンで結合することもできます。

sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1

または文字リストを使用する

sed -i -e s/@[rgbcmyRGBCMY]//g $1

または

 sed -i -e s/@[rgbcmyRGBCMY]//g *

(手紙を全部入れたか必ず確認してください)

答え3

"$@"の代わりにを使用します$1。または、ワイルドカードを引用符で囲みます。

$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2

答え4

スクリプトを変更したくない場合は、xargs を使用することもできます (xargs をお持ちの場合、またはプラットフォームで使用できる場合)。次のように実行します。

ls *.txt | xargs -L1 ./remove_cc

xargs は、stdin を受け取り、実行するコマンドのコマンド パラメータに変換するユーティリティです。1 回の実行で使用する入力行の数を制限する -L フラグがあります。

関連情報