我有一个像这样的文件:
file.foo
file2.foo
file.bar
file3.foo
现在我只想返回以 结尾的行.foo
,但我想重命名所有出现的file
with 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
答案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
(文件内替换)