SED:删除包含第一个模式但不包含第二个模式的行

时间:2014-02-13 09:25:52

标签: regex sed

我有类似的文件内容:

a1 b1
a2 b2
a2 b21
a2 b22
a3 b3
a4 b4

我需要删除包含a2且不包含b2的sed行。即得到以下结果:

a1 b1
a2 b2
a3 b3
a4 b4

3 个答案:

答案 0 :(得分:1)

使用awk即可:

cat file
a1 b1
a2 b2
a2 b21
a2 b22
a3 b3
a4 b4
a2 c3

awk '$1=="a2" && $2!="b2" {next} 8'
a1 b1
a2 b2
a3 b3
a4 b4

如果字段#1为a2且字段#2不是b2,则跳过该行。

答案 1 :(得分:1)

sed -n --posix -e '/a2/ !{
   p
   b
   }
/b2/ !p'

(根据Jotne +更正的评论b而不是t进行调整) 打印如果不包含a2然后转到下一行,如果包含,则打印如果不包含b2

或更小

sed -n '/a2/ {/b2/ b
   }
p'

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '/\ba2\b/!b;/\bb2\b/!d' file 

或:

sed '/\<a2\>/!b;/\<b2\>/!d' file