• 締切済み

grepでの抽出箇所のみ置換して上書き

例えば 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での抽出箇所のみ置換して元ファイルを上書きする方法は有りますか? 以上、宜しくお願いいたします。

みんなの回答

回答No.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にファイル名も出力させて処理してやる必要がありそうに感じました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

それは.... たぶん, パターンスペースをうまく使えばできると思う. けど, sed じゃない何かを使うことを強く勧める.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

wf3255
質問者

補足

言葉が足らずすみません。 質問はearthという文言が存在する行の2行上にある planetkind moon を planetkind taiyoに変えたいのです。 他の行にもplanetkind moonという行は存在するのです。

関連するQ&A