grepでsedストリームを分解するか、sedにgrepを作成しますか?

grepでsedストリームを分解するか、sedにgrepを作成しますか?

次のファイルがあります。

file.foo
file2.foo
file.bar
file3.foo

これで終わる行だけを返したいのですが、withを含む.fooすべての項目の名前を変更したいと思います。この場合は完全にスキップすることを意味します。私は何をすべきですか?fileblagfile.barただsedを使う?私が現在やっていることは基本的に次のとおりです。

grep '\.foo$' input | sed -e's/file/blag/'

しかし、grepを削除したいと思います。

この質問は、この回答のために行ったパイプラインに大まかに基づいています。

答え1

または、ミラーリングし、デフォルトの印刷をオフにし、置き換え、目的の行だけを印刷します。

sed -n  's/file/blag/; /\.foo$/p' < input

または、目的の行をフィルタリングします。最初、交換して印刷します。

sed -n '/\.foo$/ { s/file/blag/; p }' < input

答え2

grep私は以下を使ってパイプを取り外すことができました。sed!d

sed -e'/\.foo$/!d' -e's/file/blag/' ./input

答えは以下から来ています。このフォーラムの投稿

答え3

次に終わる行を選択し.foo、次の行でのみ置換を実行します。

sed '/\.foo$/{s/file/blag/}'

テスト:

$ echo $'file.foo\nfile2.foo\nfile.bar\nfile3.foo' | sed '/\.foo$/{s/file/blag/}'
blag.foo
blag2.foo
file.bar
blag3.foo

答え4

sed -n 's/\(file\)\(.*\)\(\.foo\)/blang\2\3/p' input.txt > output.txt

(出力ファイルへの書き込み)

または

sed -i 's/\(file\)\(.*\)\(\.foo\)/blang\2\3/' input.txt 

(ファイル内交換)

関連情報