我正在尝试自动删除文本文件中包含字母"T"但不紧随其后的" H"的所有行。 我一直在使用grep并将输出发送到另一个文件,但我无法想出可以帮助我完成此操作的神奇正则表达式。如果grep不是正确的工具,我不介意使用awk、sed或其他Linux工具。
grep -v 'T[^H]'
-v: 打印不匹配的行
[^H]: 匹配除了 H 以外的任何字符
你可以做:
grep -v 'T[^H]' input
-v
是 grep 的反向匹配选项,它不会列出与模式匹配的行。
使用的正则表达式是 T[^H]
,它匹配任何以 T
开头且后面跟着除 H
之外的任何字符的行。
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
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
,如果是,则简单地打印出来。然后使用awk
的match
函数匹配跟随T
的任何字符或行尾。由于这些被存储在两个捕获组中,因此检查数组arr的第一个元素是否为T,第二个元素是否为H,然后打印该行。
.*
的实例都不是必要的,因为grep会扫描整行寻找匹配。 - Alexander Pavlov