実行前に再帰的なsed検索と置換をテストします


13

トライアル再帰検索を実行しsed、実際に実行する前にを使用して置き換える方法はありますか?実際に検索して置換する前に、結果を印刷したいだけです。結果をエコーするようなもの、

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'

データのコピーを作成し、コマンドを実行して、結果を調べます。
クサラナナンダ

回答:


10

sedなし-iで実行し、出力をステップ実行できますless

grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less

次にsedwith -i.bakを実行して、後で差分を取ることができるバックアップを作成します

grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct

編集:コメントで示唆されているように、を使用しますgrep --null | xargs -0。これにより、ファイル名はヌルバイトで終了し、改行のような通常とは異なる文字を含むファイル名でも安全になります。はい、\nunixファイル名で有効な文字です。禁止されている文字は、スラッシュ/とヌル文字のみです\0


興味深いことに、-iの意味を見つけようとしましたが、man sedの下にはリストされていませんでした。ソリューションは機能しました。あなたの意見では、ファイル全体ではなく行だけをリストする最良の方法は何ですか?少ないパイプにパイプする代わりに grep term2が機能しましたが、奇妙な文字を含む出力も得られました。
user251482 14

@ user251482-「古いファイルと新しいファイルの差分を表示する」のように、「行をリストするだけ」?
グレブネケ14

1
@StephaneChazelasはい、またはgrep -rl --nullOPはOSを指定しなかったため、さらに良い結果が得られ、-ZBSD / OSX(decompress)では異なるものを意味します。--nullGNUやBSDの両方で同じである
grebneke

1
@grebneke。良い点ですが、OPはGNU sed構文を使用しているため、彼はBSDではないと想定できます。これgrepは、FreeBSDおよびNetBSD上のGNU grep(のフォーク)であることに注意してください。NetBSDでは、(manページによると)-Zそれでも意味がありますが、-- --nullnullの方が移植性が高いことに同意します。また、ノートのOpenBSD上--nullも-Z仕事でもないこと
ステファンChazelas

1
@grebneke、それはだsed -i '' -e s/.../BSDでsed(そこには別売オプション)
ステファンChazelas

5

使用sedするfindの代わりに、grep

まず第一に、私はを採用するのfindではなく、grep3つの正当な理由からこれを採用します。

  1. findより正確なファイル選択が可能になります。例えば、grep -r string *.txt、現在のディレクトリにのみファイルを生成します。サブディレクトリ内のものではありません。
  2. find-exec全体の必要性を排除する強力なオプションが付属しています--null … |xargs 0構成。
  3. オプションは、アクセスすることができないファイルで時間を無駄に防ぐことができます。-readable-writablefind

キャプチャテスト

ただし、grep何がキャプチャされるかを確認する最初のテストに役立ちます。

$ find . -exec grep term1 {} \;

より具体的には:

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

ドライラン

次に、ドライランに進みsedます。このsedオプション-nは同義語で--quietありpsed式の最後に現在のパターンスペースが出力されます。

$ find . -exec sed -n 's/term1/term2/gp' {} \;

より具体的には:

$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;

実行

すべてがうまく見える場合は、交換することにより決定的なコマンドを発行するsedオプションを-nすることによって-i、「代わりに」のためと除去することでp終わり。

$ find . -exec sed -i 's/term1/term2/g' {} \;

より具体的には:

$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;

もっと find

その他のfind例については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.