Как то так?
$ 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
, чтобы он не просто принимал это регулярное выражение как литерал *
, за которым следует любой символ. Вам, вероятно, придется изменить команду awk, вызываемую в cmd
, чтобы она работала разумно для ваших нужд как с действительными, так и с недействительными регулярными выражениями, но у вас есть идея - чтобы сделать что-то вроде eval
в awk, вам нужен вызов awk сам через систему () или трубу к getline. Массаж для костюма ...
О, и я не думаю, что вы можете получить статус выхода cmd
с указанным выше синтаксисом, и вы не можете захватить выходные данные системного вызова () в awk, поэтому вам, возможно, придется протестировать re дважды - сначала с помощью 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" }
'