web-dev-qa-db-ja.com

ワイルドカード*を(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 *も同様に効果がありません。

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

4
roo

./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という名前のファイルでは機能しません。

8
Jander

使用するだけ

 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 *

(必ずすべての文字を入れていることを確認してください)

8
Archemar

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

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

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

ls *.txt | xargs -L1 ./remove_cc

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

1
Didi Kohen