AWK 负正则表达式

AWK 负正则表达式

我正在寻找一个 awk 正则表达式,它可以给出与特定单词不匹配的所有字符串。

using /^((?!word \+).)*/ 在 java 中有效,但在 AWK 中无效。

获取编译失败错误,转义括号修复了编译错误,但是正则表达式匹配不正确。

如果有人可以帮助解决 awk 正则表达式,那就太好了。

我不能使用 string" !~ /regex/

我需要使用string" ~ /regex/ 正则表达式 shuould 传递所有字符串,但特定字符串。

包含的字符串domain应该被过滤掉。输入

This is domain test
This is do test
This is test

输出

This is do test
This is test

只需要使用正则表达式即可。无法更改awk代码

在 AWK 中就像string" ~ /regex/

所以只能通过一个正则表达式来实现这一点。

答案1

虽然托马斯·迪基的回答很聪明,但有一个正确的方法可以做到这一点:

awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF

This is do test
This is test

答案2

在 awk 中执行此操作的方法是编写一个与您想要的内容相匹配的模式排除,并使其行动 next。这就留下了要处理的行,这些行是您试图实现的模式的否定。

像这样的东西:

/regex/{ next; }
{ print; }

或者,如果您的脚本更复杂并且您无法使用next

<<<'the quick brown fox jumps over the lazy dog'$'\n''pack my box with five dozen liquor jugs' awk '
{ negate=0 }
/box/{ negate=1 }
negate==1 { gsub(/[aeiou]/, "%") }
negate==0 { gsub(/[aeiou]/, "#") }
{ print NR, $0; }
'

# output
1 th# q##ck br#wn f#x j#mps #v#r th# l#zy d#g
2 p%ck my b%x w%th f%v% d%z%n l%q%%r j%gs

答案3

因为你说“仅需要使用正则表达式。无法更改 Awk 代码”尝试这个:

您可以“否定正则表达式”,而不是“否定运算符”。你只需要通过否定符号!!/domain/作为awk 脚本正则表达式的一部分。

awk '{if ($0 ~ !/domain/) {print $0}}'

答案4

使用 POSIX 扩展正则表达式编写否定模式特别棘手。对于这种字符串中domain所有字符都不同的情况,您可以尝试:

awk -v re="^([^d]|d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]\
*o(d*d[^do]|[^dm])|[^da])|[doma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom\
]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[^di])|[domai]*i(d*d[^do]|[d\
o]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[do\
ma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|\
[^dm])|[^da])|[^di])|[^dn]))*[domai]*\$" '$0 ~ re'

几年前我确实想到了这一点,然后又回到了我的那篇文章每当我需要编写负正则表达式时,但我必须承认我不记得我是如何做到这一点的。

相关内容