page_path\example_filename.txt
文字列のバックスラッシュをスラッシュに置き換えたいと思います。また、大規模なファイルシステムで実行し、すべてのディレクトリを再帰的に検索できることを願っています。
オンラインでを使用するように言う人を見つけましgrep
たが、うまくいくことはできません。区切り文字とエスケープ文字のさまざまなバリエーションを試しましたが、得られませんでした。xargs
sed
これは私が実行したいコマンドです。
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