AWK在输入流上处理“()”

时间:2018-06-10 12:43:37

标签: bash awk

如下:

echo "private public () " | awk 'BEGIN{kw="private"}{for (i=1;i<=NF;i++)if (kw~$i) print $i}'

我收到错误:

awk: run time error: regular expression compile failed (missing operand)
()

这是由输入流中的括号引起的。我怎么能让awk知道它不应该解释输入流中的括号?

谢谢

2 个答案:

答案 0 :(得分:2)

这听起来像是在问你&#34;我怎么得到awk不把我的字符串视为正则表达式&#34;并且答案总是 - 不要编写使用你的字符串作为正则表达式的代码。只需将~更改为==,即可进行字符串比较而不是正则表达式比较。

如果您不是全部,那么请编辑您的问题以澄清您的要求,并提供更具真实代表性的样本输入/输出。

答案 1 :(得分:0)

我认为我得到了正确的方法: if(kw~ $ i) 我想检查一下术语($ i)是keywork(kw)列表的成员 谢谢你的回复:

我想出的解决方案是前缀: sed's / [()] / \&amp; / g' 这会转义括号,以便正则表达式解释器将它们单独留下,所以我有:

echo“private public()”| sed's / [()] / \&amp; / g'| awk'BEGIN {kw =“private”} {for(i = 1; i&lt; = NF; i ++)if if(kw~ $ i)print $ i}'

这很有效,但我正在寻找更优雅的东西。