dポイントプレゼントキャンペーン実施中!

例えば
find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon"
というコマンドを実施し、出力が
planetkind moon
だったとします。
このfile_nameファイルの一部にある
『 planetkind moon』
という箇所を
『 planetkind taiyo』
に変更したいのですが、

find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon" | xargs sed -i "s/moon/taiyo/"
とすると、ファイル中の全てのmoonがtaiyoになってしましまいます。

このgrepでの抽出箇所のみ置換して元ファイルを上書きする方法は有りますか?

以上、宜しくお願いいたします。

A 回答 (3件)

> このgrepでの抽出箇所のみ置換して元ファイルを上書きする方法は有りますか?



ありそうですね。

grepで行番号を出力、sedで行番号も指定して置換など。

grep -B 2 "earth" | head -1
235-moon

grep -B 2 "earth" | head -1 | grep moon | sed s/-.*$//
235

sed -i 235s/moon/taiyo/

こんな感じの流れにできれば良いのでしょうけど。

質問に書かれているのはfindで一つのファイルからしか見つからない前提で良いのでしょうか。
違うとしたら、grepにファイル名も出力させて処理してやる必要がありそうに感じました。
    • good
    • 0

それは....


たぶん, パターンスペースをうまく使えばできると思う.

けど, sed じゃない何かを使うことを強く勧める.
    • good
    • 0

そりゃそうだ.


sed "s/moon/taiyo/"
って, 「moon を taiyo に置き換える」ってことでしょ?
「planetkind moon」を「planetkind taiyo」に変更するなら, そのように書かないと.

この回答への補足

言葉が足らずすみません。

質問はearthという文言が存在する行の2行上にある
planetkind moon を planetkind taiyoに変えたいのです。

他の行にもplanetkind moonという行は存在するのです。

補足日時:2011/04/13 14:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!