如何在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

我不知道如何将正则表达式作为参数传递给函数

如果我传递一个字符串,就可以了

我有以下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 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/