ディレクトリ内のすべてのファイルとサブディレクトリ内の指定された文字列を再帰的に検索し、この文字列を別の文字列に置き換える必要があります。grepとreplaceする方法
grep 'string_to_find' -r ./*
しかし、私は別の文字列でstring_to_find
のすべてのインスタンスを置き換えることができますか:
私は、コマンドが、それは次のようになります見つけることがいることを知っていますか?
ディレクトリ内のすべてのファイルとサブディレクトリ内の指定された文字列を再帰的に検索し、この文字列を別の文字列に置き換える必要があります。grepとreplaceする方法
grep 'string_to_find' -r ./*
しかし、私は別の文字列でstring_to_find
のすべてのインスタンスを置き換えることができますか:
私は、コマンドが、それは次のようになります見つけることがいることを知っていますか?
通常はgrepではなく、sed -i 's/string_to_find/another_string/g'
またはperl -i.bak -pe 's/string_to_find/another_string/g'
となります。
もう1つの方法は、findを使ってsedに渡すことです。
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
OS X 10.10ターミナルでは、パラメータ '-i'に対する適切な拡張文字列が必要です。たとえば、 'find/path/to/files -type f -exec sed -i '" "s/oldstring/new string/g" {} \; 'とにかく空の文字列を指定すると、 ... – Eonil
「sed:REエラー:不正なバイトシーケンス」が表示されるのはなぜですか?そして、はい、私はOS X用の '-i" "を追加しました。そうでなければ動作します。 – taco
私はmacOS 10.12で不正なバイトシーケンスの問題を抱えていました。この質問/回答が私の問題を解決しました:http://stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x 。 – abeboparebop
これは、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
これは完璧です! ag: 'ag" search "-l -rとも動作します。 |並べ替え|ユニーク| xargs perl -e 's/search/replace' -pi' –
'sort -u'は' sort |を置き換えることができます。 uniq' –
@sebastiankellerあなたのPerlコマンドには最後のスラッシュがありません。これは構文エラーです。 – tripleee
別のオプションは、ちょうどglobstarでPerlを使用することです。あなたの.bashrc
(または場所)でshopt -s globstar
を有効にする
は**
グロブパターンは、再帰的にすべてのサブディレクトリとファイルを一致させることができます。
したがって、perl -pXe 's/SEARCH/REPLACE/g' -i **
を使用すると、再帰的になります SEARCH
をREPLACE
に置き換えます。
-X
フラグはperlに「すべての警告を無効にする」と指示します。つまり、 はディレクトリについて不平を言うことはありません。
globstarはまた、あなたが拡張子.ext
とすべての子ファイルでREPLACE
でSEARCH
を交換したい場合は、sed -i 's/SEARCH/REPLACE/g' **/*.ext
のようなものを行うことができます。
* "もう一つの選択肢は、globstarでperlを使うだけです..." * - SolarisのようなPosixyのマシンではありません。だから私は特に 'grep'と' sed'を探しているのです。 – jww
あなたも、このように従うことができる。..
例
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
これは、現在のディレクトリにすべてのファイルの相対で「窓」という文字列を検索し、「窓を交換します 'に' linux 'と入力します。
他の解決策では、正規表現の構文が混在しています。 検索の両方のためのPerl/PCREのパターンを使用して交換して、すべてのファイルの処理を回避するために、これは非常にうまく機能:
match1
と
match2
は、通常は同じですが、
match1
は、より高度な機能を削除するために簡略化することができる
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
こと置換にのみ関連している、例えばキャプチャグループ。
翻訳:grep再帰的にファイル名の特殊文字を保護するためにnulで区切られたファイルをリストし、このPCREパターンにマッチしたファイルをリストし、それらのファイル名をヌル区切りのリストを期待しているxargsにパイプします。名前がなければ何でもし、perlに各ファイルを書き換えさせて、一致するものが見つかった場合は行を置き換えます。
grep
にI
オプションを追加すると、バイナリファイルも無視されます。
&は、ファイル のviのモードに置き換える構文は次のとおりです見つける: :%は、S/WORDに見つける-HERE /置き換え-Wordを-ここ/ gの
OR :%sの/ FindMe/ReplaceME/gで
例
置換コマンドは、あなたの要件に応じて使用することができます。
私はgrepがこれを行うことはできません(私は間違っている可能性があります)。より簡単な方法は、sedやperlを使って置換えすることです。 –
'sed -i 's /.* substring。*/replace /''を使用してみてください。 –
@Eddy_Emこれは、行全体をreplaceに置き換えます。グループ化を使用して、部分文字列の前後の行の部分を取得し、置換行にその部分を配置する必要があります。 – JStrahl