![AWK 负正则表达式](https://linux22.com/image/97224/AWK%20%E8%B4%9F%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我正在寻找一个 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'
几年前我确实想到了这一点,然后又回到了我的那篇文章每当我需要编写负正则表达式时,但我必须承认我不记得我是如何做到这一点的。