- 締切済み
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での抽出箇所のみ置換して元ファイルを上書きする方法は有りますか? 以上、宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- saijyo_739
- ベストアンサー率53% (119/222)
> この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にファイル名も出力させて処理してやる必要がありそうに感じました。
補足
言葉が足らずすみません。 質問はearthという文言が存在する行の2行上にある planetkind moon を planetkind taiyoに変えたいのです。 他の行にもplanetkind moonという行は存在するのです。