中間サイズのテキストファイルのコレクションから「@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フラグがあります。