
次のファイルがあります。
file.foo
file2.foo
file.bar
file3.foo
これで終わる行だけを返したいのですが、withを含む.foo
すべての項目の名前を変更したいと思います。この場合は完全にスキップすることを意味します。私は何をすべきですか?file
blag
file.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
(ファイル内交換)