AWK 中的逆正则表达式?

AWK 中的逆正则表达式?

我正在尝试过滤掉包含特定单词的行。正则表达式是脚本的命令行输入。

$0 ~ regex {
//Do something.
}

输入示例为:

**String** **number**
domain  1
domain  2
bla     3

因此,从上面的输入中,用户可以说 - 过滤掉包含单词“domain”的行。

我尝试过的:

regex = "\?\\!domain" 

(负向前瞻)。

但这个正则表达式正在过滤掉每一行。不仅仅是带有“域”一词的行。

答案1

input对于包含以下内容的给定输入文件:

domain
demesne

过滤包含以下内容的行domain

$ awk '/domain/ { print }' input
domain

过滤行不是包含domain

$ awk '!/domain/ {print }' input
demesne

用于基于过滤场地我们可以对新的给定文件尝试以下操作,而不是整行input

example www.example.com
exemplar www.example.net

过滤掉第一个字段所在的行包含 example

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

在您的问题中,您使用的$0是整行而不是第一个字段。

答案2

另一种更灵活/更强大的过滤行的方法是{next}

  • 为了打印所有行不要匹配给定的regex,执行以下操作:
    awk '/regex/ {next} {print}' inputfile
    

您甚至可以使用此方法过滤掉两个特定行之间的所有行,如下所示:

  • 打印所有行不是在行匹配regex1和第一个下一行匹配之间regex2,执行以下操作:

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    这是不可能的方法awk '!/regex/'(如果我没记错的话)。

例如,如果您inputfile的内容是这样的:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

然后,该命令awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfile将打印:

hello, here is my confidential information


This is the end of my message

答案3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

相关内容