3

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

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

我有以下 awk 文件,

#!/usr/bin/awk -f

function find(name){
    for(i=0;i<NF;i++)if($(i+1)~name)print $(i+1)
}

{
    find("mysql")
}    

我做类似的事情

$ ./fct.awk <(echo "$str")

这工作正常。

但是当我调用 awk 文件时,

{
    find(/mysql/)
}  

这不起作用。

我究竟做错了什么?

谢谢,

埃里克·J。

4

4 回答 4

5

您不能(不应该)将正则表达式常量传递给用户定义的函数。在这种情况下,您必须使用动态正则表达式。喜欢find("mysql")

如果你这样做find(/mysql/)了,awk 的作用是:find($0~/mysql/)所以它将 a 0or传递1给你的find(..)函数。

有关详细信息,请参阅此问题。

需要awk变量赋值语句解释

http://www.gnu.org/software/gawk/manual/gawk.html#Using-Constant-Regexps

部分:6.1.2 使用正则表达式常量

于 2013-09-17T14:06:36.147 回答
4
warning: regexp constant for parameter #1 yields boolean value

$0正则表达式在传递给函数之前被评估(匹配)。你必须使用字符串。

注意:确保进行正确的转义:http ://www.gnu.org/software/gawk/manual/gawk.html#Computed-Regexps

于 2013-09-17T14:01:16.150 回答
0

如果您使用 GNU awk,您可以使用正则表达式作为用户定义的函数参数。
您必须将您的正则表达式定义为@/.../.

在您的示例中,您将像这样使用它:

function find(regex){
    for(i=1;i<=NF;i++)
            if($i ~ regex)
                    print $i
}

{
    find(@/mysql/)
}    

它被称为强类型正则表达式常量,它从GNU awk 版本 4.2(2017 年 10 月)开始可用。

这里的例子。

于 2021-05-03T17:05:43.363 回答
0

使用引号,将它们视为字符串。这种方式适用于 mawk、mawk2 和 gnu-gawk。但是您还需要将反斜杠加倍,因为使它们成为字符串会立即吃掉其中一个。

在您的示例中就find("mysql")足够了。

您实际上可以根据需要让它传递任意正则表达式,而不仅限于 gnu-gawk,只要您愿意将它们设为字符串而不是@/../其他人提到的语法。这就是 # of 反斜杠产生影响的地方。

你甚至可以用任意字节制作正则表达式,最好是通过八进制代码。如果您"\342\234\234"使用正则表达式,系统会在匹配之前将其转换为正则表达式中的实际字节。

虽然这种方法没有任何意义,但如果你想 100% 安全并且不想让任意字节到处乱飞,请将其写为

"[\\342][\\234][\\234]"  ----> ✜

一旦最初被 awk 读取以创建内部表示,它将如下所示:

[\342][\234][\234]

它仍然会匹配您想要的相同对象(在这种情况下,某种交叉外观的 dingbat)。由于试图将非 ASCII 字节直接包含在方括号中,这将在 gawk 的 unicode 感知模式下发出恼人的警告。对于那个用例,

"\\342\\234\\234" ------(eqv to )--->  /\342\234\234/

会让傻瓜保持快乐和安静。最近我一直在填补我自己代码中的空白并编写可以模仿 perl 喜欢的所有 Unicode 脚本类的正则表达式。

于 2021-05-03T22:25:42.170 回答