繁体   English   中英

sed / awk:删除所有与一个单词匹配的行,而不是另一个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM