sed - 删除所有包含一种模式但不包含另一种模式的行
sed - delete all lines that contain one pattern but not another
我想删除文件中包含一种模式但不包含另一种模式的所有行。
例如,如果我有这个文件:
hello people foo
hello world bar
hello something
blah blah blah
我想删除所有包含 hello
但不包含 world
的行,以便我的文件如下所示:
hello world bar
blah blah blah
我尝试了以下方法:
sed -n '/hello/p' file | sed -i '/world/!d'
但我收到错误消息 -i may not be used with stdin
这应该有效
sed -i '/hello/{/world/!d}' file
awk 替代方案:
awk '!/hello/ ||/world/' file
sed -i.bak '/hello/{/world/!d}
这个答案不同,因为为 -i 提供了扩展。
我下面的帖子应该有用
sed command with -i option failing on Mac, but works on Linux
单次 sed 调用:
sed -n '/hello/ {/world/d; p}' file
对于匹配/hello/
的行,如果也匹配/world/
删除,否则打印
只需使用 awk 来保持逻辑简单如所述:
$ awk '/hello/ && !/world/{next} 1' file
hello world bar
blah blah blah
玩了一圈之后,我获得了一个实现 sed
的脚本,它对我有用:
file=
patt=$(sed -n '/world/p' $file)
sed -n "/hello/!p;/$patt/p" $file
我想删除文件中包含一种模式但不包含另一种模式的所有行。
例如,如果我有这个文件:
hello people foo
hello world bar
hello something
blah blah blah
我想删除所有包含 hello
但不包含 world
的行,以便我的文件如下所示:
hello world bar
blah blah blah
我尝试了以下方法:
sed -n '/hello/p' file | sed -i '/world/!d'
但我收到错误消息 -i may not be used with stdin
这应该有效
sed -i '/hello/{/world/!d}' file
awk 替代方案:
awk '!/hello/ ||/world/' file
sed -i.bak '/hello/{/world/!d}
这个答案不同,因为为 -i 提供了扩展。
我下面的帖子应该有用
sed command with -i option failing on Mac, but works on Linux
单次 sed 调用:
sed -n '/hello/ {/world/d; p}' file
对于匹配/hello/
的行,如果也匹配/world/
删除,否则打印
只需使用 awk 来保持逻辑简单如所述:
$ awk '/hello/ && !/world/{next} 1' file
hello world bar
blah blah blah
玩了一圈之后,我获得了一个实现 sed
的脚本,它对我有用:
file=
patt=$(sed -n '/world/p' $file)
sed -n "/hello/!p;/$patt/p" $file