从 grep 中分解出 grep | sed 流还是在 sed 中编写 grep ?

从 grep 中分解出 grep | sed 流还是在 sed 中编写 grep ?

我有一个像这样的文件:

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

现在我只想返回以 结尾的行.foo,但我想重命名所有出现的filewith 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 

(文件内替换)

相关内容