如果动态正则表达式评估不好,我如何捕获错误:
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)
答案 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" }
'