如何在AWK中将正则表达式传递给函数
我不知道如何将正则表达式作为参数传递给函数 如果我传递一个字符串,就可以了 我有以下awk文件如何在AWK中将正则表达式传递给函数,awk,Awk,我不知道如何将正则表达式作为参数传递给函数 如果我传递一个字符串,就可以了 我有以下awk文件 #!/usr/bin/awk -f function find(name){ for(i=0;i<NF;i++)if($(i+1)~name)print $(i+1) } { find("mysql") } { find(/mysql/) } 这是行不通的 我做错了什么 谢谢 埃里克J warning: regexp constant for para
#!/usr/bin/awk -f
function find(name){
for(i=0;i<NF;i++)if($(i+1)~name)print $(i+1)
}
{
find("mysql")
}
{
find(/mysql/)
}
这是行不通的
我做错了什么
谢谢
埃里克J
warning: regexp constant for parameter #1 yields boolean value
在将正则表达式传递给函数之前,将对其进行求值(与$0
匹配)。你必须使用字符串
注意:确保正确转义:您不能(不应该)将regex常量传递给用户定义的函数。在这种情况下,必须使用动态正则表达式。比如find(“mysql”)
如果您执行find(/mysql/)
,awk所做的是:find($0~/mysql/)
,因此它将0
或1
传递给find(…)
函数
详见本问题
也
第6.1.2节使用正则表达式常量如果使用GNU awk,可以使用正则表达式作为用户定义的函数参数。您必须将正则表达式定义为
@/../
在您的示例中,您可以这样使用它:
function find(regex){
for(i=1;i<=NF;i++)
if($i ~ regex)
print $i
}
{
find(@/mysql/)
}
函数查找(regex){
对于(i=1;i使用引号,将其视为字符串。这样,它适用于mawk、mawk2和gnu-gawk。但您还需要将反斜杠加倍,因为将其设置为字符串会立即吃掉其中一个
在您的示例中,只需find(“mysql”)
就足够了
实际上,您可以让它按照您的意愿传递任意正则表达式,而不仅仅局限于gnu gawk,只要您愿意使它们成为字符串而不是其他人提到的@/./
语法。这就是反斜杠的作用所在
您甚至可以使用任意字节生成正则表达式,最好是通过八进制代码。如果您将正则表达式设置为“\342\234\234”
,系统将在匹配之前将其转换为正则表达式中的实际字节
虽然这种方法没有任何好处,但如果您希望100%安全,并且不想让任意字节四处乱飞,请将其编写为
"[\\342][\\234][\\234]" ----> ✜
一旦awk最初读取以创建内部表示,它将如下所示:
[\342][\234][\234]
它仍将匹配您想要的相同对象(在本例中,是某种交叉外观的丁巴)。这将在unicode感知模式下发出恼人的警告,因为试图将非ASCII字节直接括在方括号中。对于该用例
"\\342\\234\\234" ------(eqv to )---> /\342\234\234/
将使gawk保持愉快和安静。最近,我一直在填补自己代码中的空白,并编写可以模仿perl喜欢的所有Unicode脚本类的正则表达式。关于出错原因的解释很好,但有了解决方案也很好。传递字符串将很难处理诸如“\w+”之类的问题.所以在这种情况下,这并不是一个通用的解决方案。
"\\342\\234\\234" ------(eqv to )---> /\342\234\234/