Ловушка или оценка неверной строки регулярного выражения во время выполнения в сценарии awk - PullRequest
0 голосов
/ 08 мая 2018

Как я могу перехватить ошибку, если оценка динамического регулярного выражения плоха, например:

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 голосов
/ 08 мая 2018

Как то так?

$ 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" }
'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...