%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AB%E6%B8%A1%E3%81%99%20.png)
中程度の大きさのテキスト ファイルのコレクションから、「@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 フラグがあります。