web-dev-qa-db-ja.com

ディレクトリツリー内の文字列のすべての出現を再帰的に見つけて置き換える方法は?

Grepとsedだけを使用して、次のすべての出現を置き換えるにはどうすればよいですか?

a.example.com

b.example.com

/home/user/ディレクトリツリーの下のテキストファイル内で、サブディレクトリ内のすべてのファイル内のすべてのオカレンスも再帰的に検索および置換します。

46
Tony

これを試して:

find /home/user/ -type f | xargs sed -i  's/a\.example\.com/b.example.com/g'

ドットディレクトリを無視する場合

find . \( ! -regex '.*/\..*' \) -type f | xargs sed -i 's/a\.example\.com/b.example.com/g'

編集:検索式のエスケープされたドット

70
vehomzzz

これを試して:

grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g'

grep -rlは、ディレクトリ内のSEARCHSTRINGを再帰的に検索します./そして、sedを使用して文字列を置き換えます。

例:

ディレクトリTOMJERRYとして検索文字列を使用して、名前SWATKATSCARTOONNETWORKに置き換えます

grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g'

これにより、TOMが文字列JERRYを見つけたすべてのファイルおよびサブディレクトリで、CARTOONNETWORKSWATKATSに置き換えられます。

27

これは非常に古い質問ですが、...

  1. @vehomzzzの答えは、質問が明示的にfindxargsのみを示している場合、grepsedを使用します。

  2. @EmployedRussianと@BrooksMosesは、それがawksedの二重だと言おうとしましたが、そうではありません-再び、質問は明示的にgrepsedと言いますonly

だからここに私の解決策があります、あなたがあなたのシェルとしてBashを使用していると仮定して:

OLDIFS=$IFS
IFS=$'\n'
for f in `grep -rl a.example.com .` # Use -irl instead of -rl for case insensitive search
do
    sed -i 's/a\.example\.com/b.example.com/g' $f # Use /gi instead of /g for case insensitive search
done
IFS=$OLDIFS

Unix Shellなどの別のシェルを使用している場合はお知らせください。構文調整を見つけようとします。

PS:ワンライナー:

OLDIFS=$IFS;IFS=$'\n';for f in `grep -rl a.example.com .`;do sed -i 's/a\.example\.com/b.example.com/g' $f;done;IFS=$OLDIFS

ソース:

4
Timberwolf

私にとっては次のコマンドが動作します:

find /path/to/dir -name "file.txt" | xargs sed -i 's/string_to_replace/new_string/g'

文字列にスラッシュ「path/to/dir」が含まれる場合、「/」の代わりに「@」のように、別の文字で置き換えることができます。

例えば: 's@string/to/replace@new/string@g'

2
Yahor M

このコマンドを試してください:

/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;
1
Navneet

それよりもずっと簡単です。

for i in `find *` ; do sed -i -- 's/search string/target string/g' $i;

完了

find i =>は、フォルダー内およびサブフォルダー内のすべてのファイルをSEDに導入します。

sed -i =>は、ファイル内の関連する文字列が存在する場合に置き換えます。

1
gilad 1

以下のコマンドは、名前が検索パターンに一致するすべてのファイルを再帰的に検索し、文字列を置き換えます。

find /path/to/searchdir/ -name "serachpatter" -type f | xargs sed -i 's/stringone/StrIngTwo/g'

また、再帰の深さを制限する場合は、制限も設定できます。

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g'

0
akprajapati