変更されたファイルのバックアップのみを作成するsedインプレース置換を実行する方法は?


13

現在の作業ディレクトリ内のすべてのファイルで使用されている用語を置き換えるために、次を実行しました。

$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

これは単語の置換を実行しました.bupが、Ms. Johnson文字列を持たないファイルのファイルも作成しました。

これらすべての不要なバックアップを作成せずに置換を実行するにはどうすればよいですか?



おそらく、保存して終了exする:!cp '%' '%.bup'前に実行し、条件付きで(ファイルが変更された場合のみ)実行することで、より良いアプローチが可能です。調べる価値があるかもしれません。
ワイルドカード

上記viスタック交換に関するアイデアについて質問を書きました。
ワイルドカード

回答:


6

ファイルの内容をチェックして、操作時に置換が行われることを確認できsedます。

find . \
    -type f \
    -exec grep -q 'Ms. Johnson' {} \; \
    -print0 |
xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

あなたがそれについて本当に賢くなりたいなら、あなたはfindまったく使用することを控えることができます:

grep -Z -l -r 'Ms. Johnson' |
    xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

1
私はあなたが必要だと思う'{}'だけで、あなたの前\;のそれ-exec
ジャンダー

8

Findには、-exec任意のコマンドを実行する演算子があります。さらに良いの-execテストですので、複数-execのを連鎖させることができ、以前のコマンドが失敗した場合、後のコマンドは実行されません。文字列{}は現在のファイル名に置き換えられ;、コマンドの終わりを示します。シェルの干渉を避けるために、両方を引用する必要があります。

そう:

find . -type f \
    -exec grep -q 'Ms. Johnson' '{}' \; \
    -exec sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' '{}' \;

素の{}を使用しても問題はありません。
アンフェタマシン

1
@amphetamachine:どちらもありませんが、manページでそれが示唆されています。cshの場合もあれば{}、ブレース展開時にヌル文字列に展開するシェル(BashではなくPOSIXでもない)が存在する場合があります。
ジャンダー

4

私はマニュアルページを見ましたが、sedあなたが尋ねる前にしたと確信しているので、直接それを行う方法がわかりませんでした。grepを使用してこれを回避する方法はいくつかありますが、最も簡単な方法は次のとおりです。

grep -rlZ "Ms. Johnson" . | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

-r再帰的な
-l印刷ファイル
-Z名はヌルで名前を終了するだけです


-1

最初に検索用語に一致するファイルのリストを作成する必要があるようです。

search="test"
for match in $(find -type f -exec grep -l $search "{}" \;)
do sed -i'.bup' -e "/$search/ s/$search/Mrs. Melbin/g" "$match"
done

.の最初の引数としてを忘れましたfind。また、私はそれほど前に自分自身に通知されたので、あなたは実際に引用したり、エスケープする必要はありません{}
ケビン

ファイルのリストを生成して、その上でコマンド置換を実行しないでください。最初にfind、改行で区切られたファイルのリストを生成し、次にシェルがこのリストを空白だけで(改行だけでなく)分割し、次にシェルが各単語をグロブパターンとして扱います。これは、ファイル名に空白またはが含まれていない場合にのみ機能します\[?*。このページの他の回答は、これを正しく行う方法を示しています。
ジル「SO-悪であるのをやめる」

@Kevin .は、パスが引数に渡されない場合に想定されるため、find(少なくともLinuxで見つかったfind)では不要です。
レブシェード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.