異なるディレクトリを持つ多くのテキストファイルがあります。特定の文字列を検索する必要があり、その文字列を$test
。これを行うには、すべてのディレクトリ内のすべてのファイルを検索する必要があります。
例:ファイルにasという文字列があり、この文字列をにabcd
置き換える必要があります。その文字列のすべてのファイルを検索して置き換えるスクリプトがあります。ただし、文字列を記号に置き換えることはできません。以下のスクリプトではこれを必要としません。abcd
$test
$
$
command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs perl -pi.bak1 -w -e 's/abcd/test/g;'"
以下のスクリプトは$
シンボルと一緒には機能しません。
command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs perl -pi.bak1 -w -e 's/abcd/\$test/g;'"
文字abcd
列を$test
。
答え1
コマンドを変数に入れようとしないでください(例:変数に保存されたコマンドをどのように実行できますか?")。
$
Perlはスカラー変数にコマンドを使用するため、コマンドに問題があります。シェルからエスケープするだけでなく、Perl( \\\$
) でもエスケープする必要があります。
abcd
$test
現在のディレクトリ内または下のすべてのファイルをGNUまたはBSDに置き換えるには、次のようにします。find
sed
find . -type f \
-exec grep -qF 'abcd' {} ';' \
-exec sed -i.bak 's/abcd/$test/g' {} ';'
その後、すべての一般的なファイルを見つけて、その文字列がファイルにあるかどうかをテストし、その場合はその文字列に置き換えます$test
(サフィックス付きの元のファイルのバックアップを作成します.bak
)。
同じことですが、Perlを使用している場合:
find . -type f \
-exec grep -qF 'abcd' {} ';' \
-exec perl -pi.bak -e 's/abcd/$test/g' {} ';'
その部分を削除すると、-exec grep
文字列が含まれていなくてもすべてのファイルのバックアップファイルが得られますabcd
。