ワイルドカード*を(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

ただし、多くのtxtファイルを含むフォルダに入って./remove_cc *.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を使用することもできます(該当するスクリプトがある場合、またはプラットフォームで利用可能な場合)。

ls *.txt | xargs -L1 ./remove_cc

xargs は、stdin をインポートして実行するコマンドのコマンド引数に変換するユーティリティです。単一の実行に使用される入力ラインの数を制限する-Lフラグがあります。

関連情報