ファイルの文字列を再帰的に置き換える

ファイルの文字列を再帰的に置き換える

page_path\example_filename.txt文字列のバックスラッシュをスラッシュに置き換えたいと思います。また、大規模なファイルシステムで実行し、すべてのディレクトリを再帰的に検索できることを願っています。

オンラインでを使用するように言う人を見つけましgrepたが、うまくいくことはできません。区切り文字とエスケープ文字のさまざまなバリエーションを試しましたが、得られませんでした。xargssed

これは私が実行したいコマンドです。
grep -lr -e 'page_path\\' * | xargs sed -i 's/page_path\/page_path//g'

よろしくお願いします。

答え1

これを使用すると、grep | xargsファイル名にスペース、引用符、バックスラッシュ(実装によってはより多くの可能性があります)に関連するxargs問題が発生します。

grepそして、GNU実装を使用すると、ゼロバイトを区切り文字として使用することで、xargsこれらの問題を回避できます。grep -lZr ... | xargs -r0 sed ...

ここで、sed コマンドについて説明します。トリックは、s/a/b/他の文字の代わりに区切り文字として使用できることです。たとえば、次のようになりますs#a#b#

sed -i 's#page_path\\#page_path/#g'

答え2

findを使用してこれを達成することもできます。

find /your/path -type f -exec grep -l 'page_path\\' {} \; -exec sed -i 's#page_path\\#page_path/#g' {} \;

2番目の実行は最初の実行が成功した場合にのみ実行され、ファイル名に必要な文字を印刷またはエスケープできないという問題は発生しません。

答え3

これらすべての命令を呼び出して CPU サイクルを無駄にする理由強く打つ必要な入力量を減らす機能が構築されていますか?

はい

str='page_path\example_filename.txt'
echo "${str//\\/\/}"

出力

page_path/example_filename.txt

答え4

ripgrepここでも役に立ちます。 fooを一致させたい項目に置き換えてから、rg呼び出しsedと式で変更します。

rg foo --files-with-matches | xargs sed -i 's/foo/bar/g'

ファイル名にスペースがある可能性がある場合は、ripgrepにそれをNULLバイトで区切るように指示してください。

rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g'

源泉:https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#search-and-replace

関連情報