在运行时在awk脚本中捕获或评估错误的正则表达式字符串

时间:2018-05-08 11:06:12

标签: awk

如果动态正则表达式评估不好,我如何捕获错误:

var='lazy dog'
# a fixed Regex here, but original is coming from ouside the script
Regex='*.'

#try and failed
if (var ~ Regex) foo

目标是管理此错误,因为我无法测试正则表达式本身(它来自外部源)。使用POSIX awk(AIX)

1 个答案:

答案 0 :(得分:3)

这样的东西?

$ echo 'foo' |
awk -v re='*.' '
    BEGIN {
        cmd="awk --posix \047/" re "/\047 2>&1"
        cmd | getline rslt
        print "rslt="rslt
        close(cmd)
    }
    { print "got " $0 " but re was bad" }
'
rslt=awk: cmd. line:1: error: Invalid preceding regular expression: /*./
got foo but re was bad

我使用gawk所以我必须添加--posix以使其不仅仅接受regexp作为文字*后跟任何字符。您可能必须更改cmd中调用的awk命令,以便通过有效和无效的正则表达式合理地满足您的需求,但您明白了 - 在您需要的awk中执行类似eval的操作让awk通过system()或管道调用自己来获取getline。按摩适合...

哦,我不认为你可以使用上面的语法获得cmd的退出状态,并且你无法捕获awk中system()调用的输出,所以你可能需要测试重新两次 - 首先使用system()查看它是否失败,但将其输出重定向到/ dev / null,然后在失败时再次使用getline运行它以捕获错误消息。

类似的东西:

awk -v re='*.' '
    BEGIN {
        cmd="awk --posix \047/" re "/\047 2>&1"
        if ( system(cmd " > /dev/null") ) {
            close(cmd " > /dev/null")
            cmd | getline rslt
            print "rslt="rslt
            close(cmd)
        }
    }
    { print "got " $0 " but re was bad" }
'