「@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 *
も同様に効果がありません。
これを修正して機能させる方法はありますか?
./remove_cc *
と入力すると、シェルはそれを./remove_cc file1.txt file2.txt file3.txt etc
に変更し、そのようにスクリプトを実行します。スクリプトは、最初のパラメーター(file1.txt)である$1
のみを調べています。
これを行う最も一般的な方法は、各パラメーターを順番にループすることです。 "$@"
はすべてのパラメーターのリストに展開され、for
を使用してそれらをループできます。
for n in "$@" ; do
sed -ie 's/@r//g' "$n"
...
done
この特定のケースでは、sed
は複数のファイル名を取るため、簡略化できます。
sed -ie 's/@r//g' "$@"
シェルスクリプトを作成するときは、引用符に注意することが重要であることに注意してください。たとえば、引用符がないと、スクリプトはMy Text File.txt
という名前のファイルでは機能しません。
使用するだけ
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 *
(必ずすべての文字を入れていることを確認してください)
使用する "$@"
の代わりに $1
。または、ワイルドカードを引用します。
$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2
スクリプトを変更したくない場合は、次のように実行してxargsを使用することもできます(スクリプトがあるか、プラットフォームで使用できるかを考慮して)。
ls *.txt | xargs -L1 ./remove_cc
xargsは、stdinを取得して、実行するコマンドのコマンドパラメータに変換するユーティリティです。単一の実行で使用される入力行の量を制限する-Lフラグがあります。