文字列を$ testに置き換える

文字列を$ testに置き換える

異なるディレクトリを持つ多くのテキストファイルがあります。特定の文字列を検索する必要があり、その文字列を$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に置き換えるには、次のようにします。findsed

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

関連情報