[英]sed / awk: Delete all lines matching a word not followed by another word
我的文件中包含以下几行。
<stuff>
test1.*test2
test1
test1.*test2
test1
<other stuff>
我想删除所有包含test1的行,但不删除test2 -这意味着我应该以:
<stuff>
test1.*test2
test1.*test2
<other stuff>
我已经尝试了很多正则表达式,但似乎无法破解sed或awk。 这是我在用vim regexp测试之后的最新尝试。
sed -i .bk '/^.*test1\(\(test2\)\@!.\)*$/d' file
(这是Mac OS X上bash脚本的一部分)
使用两个表达式。 第一个跳过test1
后跟test2
,第二个删除test1
仅在不存在test2
下才可以到达它。
sed -e '/test1.*test2/b' -e '/test1/d'
尝试类似的方法:
awk '/test1/&&!/test2/{next}1' file
我们告诉awk:
test1
查找行。 test2
不应该存在 $ cat file
<stuff>
test1.*test2
test1
test1.*test2
test1
<other stuff>
$ awk '/test1/&&!/test2/{next}1' file
<stuff>
test1.*test2
test1.*test2
<other stuff>
带有perl正则表达式的GNU grep:
grep -vP 'test1(?!.*test2)' file
$ awk '!/test1/||/test2/' file
<stuff>
test1.*test2
test1.*test2
<other stuff>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.