ディレクトリ内のすべてのファイルとサブディレクトリ内の指定された文字列を再帰的に検索し、この文字列を別の文字列に置き換える必要があります。
それを見つけるためのコマンドは次のようになります。
grep 'string_to_find' -r ./*
しかし、どうすればのすべてのインスタンスstring_to_find
を別の文字列に置き換えることができますか?
私は答えを得ました。
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
これは、OS X で私にとって最適に機能します。
grep -r -l 'searchtext' . | sort | uniq | xargs perl -e "s/matchtext/replacetext/" -pi
ソース: http://www.praj.com.au/post/23691181208/grep-replace-text-string-in-files
通常、grepではなく、sed -i 's/string_to_find/another_string/g'
または。を使用しperl -i.bak -pe 's/string_to_find/another_string/g'
ます。
他のソリューションでは、正規表現構文が混在しています。検索と置換の両方に perl/PCRE パターンを使用し、一致するファイルのみを処理するには、これは非常にうまく機能します。
grep -rlIZPi 'match1' | xargs -0r perl -pi -e 's/match2/replace/gi;'
match1
match2
通常は同じですが、グループのキャプチャなど、置換にのみ関連するより高度な機能を含めることができmatch2
ます。
翻訳:grep
一致するファイル名を再帰的にリストし、それぞれを null で区切って特殊文字を保護します。xargs
null で区切られたリストが必要なファイル名をパイプします。ファイル名が受信された場合はperl
、実際の置換を実行するためにそれらを渡します。
大文字と小文字を区別する一致では、式からフラグとパターン修飾子を削除しますが、i
フラグgrep
自体i
は削除しません。バイナリ ファイルを含めるには、からフラグを削除します。s///
i
perl
I
grep
これが私がすることです:
find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'
これは、ファイルfilename
名に./path/to/dir
searchstring
old
new
filename
ただし、ファイル名に文字列が含まれる特定のファイルの検索を省略したい場合は、次のようにします。
find /path/to/dir -type f -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'
これは上記と同じことを行いますが、/path/to/dir
.
もう 1 つのオプションは、globstar で perl を使用することです。
shopt -s globstar
あなた.bashrc
(またはどこでも)で有効にすると、 **
glob パターンがすべてのサブディレクトリとファイルを再帰的に一致させることができます。
したがって、 usingperl -pXe 's/SEARCH/REPLACE/g' -i **
は再帰的に に置き換えSEARCH
られREPLACE
ます。
この-X
フラグは、perl に「すべての警告を無効にする」ように指示します。これは、ディレクトリについて文句を言わないことを意味します。
globstar を使用するsed -i 's/SEARCH/REPLACE/g' **/*.ext
とSEARCH
、REPLACE
すべての子ファイルを拡張子.ext
.