313

ディレクトリ内のすべてのファイルとサブディレクトリ内の指定された文字列を再帰的に検索し、この文字列を別の文字列に置き換える必要があります。

それを見つけるためのコマンドは次のようになります。

grep 'string_to_find' -r ./*

しかし、どうすればのすべてのインスタンスstring_to_findを別の文字列に置き換えることができますか?

4

9 に答える 9

232

私は答えを得ました。

grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
于 2013-03-14T06:42:44.307 に答える
36

これは、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

于 2014-01-25T07:52:37.977 に答える
6

通常、grepではなく、sed -i 's/string_to_find/another_string/g'または。を使用しperl -i.bak -pe 's/string_to_find/another_string/g'ます。

于 2013-03-14T06:42:32.117 に答える
6

他のソリューションでは、正規表現構文が混在しています。検索と置換の両方に perl/PCRE パターンを使用し、一致するファイルのみを処理するには、これは非常にうまく機能します。

grep -rlIZPi 'match1' | xargs -0r perl -pi -e 's/match2/replace/gi;'

match1match2通常は同じですが、グループのキャプチャなど、置換にのみ関連するより高度な機能を含めることができmatch2ます。

翻訳:grep一致するファイル名を再帰的にリストし、それぞれを null で区切って特殊文字を保護します。xargsnull で区切られたリストが必要なファイル名をパイプします。ファイル名が受信された場合はperl、実際の置換を実行するためにそれらを渡します。

大文字と小文字を区別する一致では、式からフラグとパターン修飾子を削除しますが、iフラグgrep自体iは削除しません。バイナリ ファイルを含めるには、からフラグを削除します。s///iperlIgrep

于 2016-11-03T06:22:14.740 に答える
1

これが私がすることです:

find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

これは、ファイルfilename名に./path/to/dirsearchstringoldnew

filenameただし、ファイル名に文字列が含まれる特定のファイルの検索を省略したい場合は、次のようにします。

find /path/to/dir -type f -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

これは上記と同じことを行いますが、/path/to/dir.

于 2019-08-29T06:27:36.547 に答える
-1

もう 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' **/*.extSEARCHREPLACEすべての子ファイルを拡張子.ext.

于 2015-09-12T17:16:29.947 に答える