grepで見つかったすべてのファイルの文字列を置き換えます。操作できません

grepで見つかったすべてのファイルの文字列を置き換えます。操作できません

必要なすべてのファイルを見つけるためにgrepを使用しました。grep --include=\*.{php,ini,conf,sh} -ril -P "'([\d\w\-\_\.]+)(@domain.com)'" '/var/www_data/somepath/'

ここで、置換プロセスを実行するためにsedまたはPerlを使用すると仮定します。残念ながら、どちらかの方法で上記の正規表現を使用する方法はわかりません。私は見たこの方法そしてこの方法しかし、私が言ったように、私のパターンでは動作させることはできません(コマンドを実行した後、次の行に>が表示されることを意味します。sedまたはPerlで使用すると、上記の正規表現に問題があるようです)についてのアドバイスがあれば良いでしょう。

また、可能であるかどうかはわかりませんが(あまり重要ではありません)、置換が発生する各ファイルに対していくつかの文字列を印刷したいと思います。たとえば、File fixed: /path/to/file/(grepリストからファイル名を取得できますか?)

答え1

通常、をクリックして次の行に表示される場合、>提案の1つがまだ終了していないことを意味します。正規表現でこのエラーが見つかりません。ただし、/var/www_data/somepath/パスを一重引用符で囲む必要はありません。には珍しいキャラクターがないようですがsomepath

とにかくsedで正規表現をテストしました。私にとっては構文\d\wのように見えますvim。だから私はそれをASCIIに翻訳しました(常に動作します)。また、[]心が脱出する必要もありません.

sed -r "s/'([A-Za-z0-9_-.]+)(@domain.com)'/'adsf'/g" test.dat

実際に操作を実行するためにsedまたはを使用できます。ギガバイト単位のデータがない場合は、ファイルリストをperl作成する必要はありません。grepこれにより、事前分類によって速度の利点が得られます。

あなたのテスト正規表現、次のことができます。

cd /var/www_data/somepath/
sed -r 's|pattern|replace-pattern|g' a_single_file.php

結果がうまくいけば、-ibak--in-place=bak)パラメータを追加してすべてのファイルに対して実行してください。

find . -type f -name '*.php' -o -name '*.ini' -o name '*.conf' -o -name '*.sh' \
-exec sed -r -ibak 's|pattern|replace-pattern|g' '{}' \; 

元のファイルをに入れています<orignalname.php>.bak

最後の質問に答えるために。これには、上記のsedで作成されたファイルから実行できるgrepツールが必要です。.bak

grep --recursive --include='*.bak' -E --files-with-matches 'pattern' . > files_fixed.txt

または簡単に:

find . -type f -name '*.bak'

答え2

GNUをsed使用するとsed -i

sed -i 'script' *.{php,ini,conf,sh}

答え3

ほとんどのLinux:

sed -i 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

MacOSの場合:

sed -i '' 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

MacOSのsedには、-iの後にバックアップパラメータが必要です。ファイルをバックアップする必要がない場合は、空の文字列を使用してください。 「g」はグローバル置換のためのもので、そうでなければ各行の最初のものです。

関連情報