Grep正则表达式:列出除了...之外的所有行

51
我正在尝试自动删除文本文件中包含字母"T"但不紧随其后的" H"的所有行。 我一直在使用grep并将输出发送到另一个文件,但我无法想出可以帮助我完成此操作的神奇正则表达式。如果grep不是正确的工具,我不介意使用awk、sed或其他Linux工具。
4个回答

99
那应该就可以了:
grep -v 'T[^H]'

-v: 打印不匹配的行

[^H]: 匹配除了 H 以外的任何字符


2
两个.*的实例都不是必要的,因为grep会扫描整行寻找匹配。 - Alexander Pavlov

18

你可以做:

grep -v 'T[^H]' input

-v 是 grep 的反向匹配选项,它不会列出与模式匹配的行。

使用的正则表达式是 T[^H],它匹配任何以 T 开头且后面跟着除 H 之外的任何字符的行。


1
从文件中读取行,排除空行和以#开头的行。
grep -v '^$\|^#' folderlist.txt

folderlist.txt

# This is list of folders
folder1/test
folder2
# This is comment
folder3

folder4/backup
folder5/backup

结果将会是:

folder1/test
folder2
folder3
folder4/backup
folder5/backup

0
在这里添加了2个awk解决方案。

第一种解决方案(更简单的解决方案):使用简单的awk和任何版本的awk

awk '!/T/ || /TH/' Input_file

检查2个条件:

  • 如果一行不包含T或者

  • 如果一行包含TH,那么:

    如果上述任何一个条件为TRUE,则简单地打印该行。



第二种解决方案(GNU awk 特定): 使用 GNU awk,使用 match 函数,其中提到正则表达式 (T)(.|$) 并使用 match 函数的数组创建能力。

awk '
!/T/{
  print
  next
}
match($0,/(T)(.|$)/,arr) && arr[1]=="T" && arr[2]=="H"
' Input_file

说明:首先检查一行是否没有T,如果是,则简单地打印出来。然后使用awkmatch函数匹配跟随T的任何字符或行尾。由于这些被存储在两个捕获组中,因此检查数组arr的第一个元素是否为T,第二个元素是否为H,然后打印该行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接