Регулярное выражение в Perl не работает, как ожидалось - PullRequest
0 голосов
/ 25 мая 2018

У меня есть простой скрипт bash, который использует строку кода Perl + регулярное выражение для извлечения необходимого фрагмента строки.Похоже,

ANSWER=$(host $IPW 2>/dev/null | perl -p -e 's#^.+\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+$#\1#;'

По большей части работает, но время от времени выдает неожиданные совпадения.Пример:

$ echo "Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)" | perl -p -e 's#^.+?\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+?(?=\.$)#\1#;'

Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)

Предполагается, что строка соответствует частям строки, например «server100» (буквы + цифры), и возвращает соответствующую часть.Есть что-то, чего мне не хватает или пока не понимаю.(извините за беспокойство)

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я предполагаю, что образец текста, который вы показываете, не должен быть напечатан вообще?

Я предлагаю вам использовать простое совпадение вместо замены.Я также удалил лишние части вашего шаблона регулярных выражений

perl -lne 'print $1 if /.*\s([a-z]{4,8}\d{1,3})(?=-\d\.)/i'
0 голосов
/ 25 мая 2018

Ваше регулярное выражение не соответствует, поэтому замена не производится.Поэтому строка печатается как есть.

Если вы не хотите печатать при отсутствии совпадений, вы можете использовать -n вместо -p, плюс and print, чтобы напечатать строку в случае успехазамена:

echo "Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)" | 
    perl -n -e 's#^.+?\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+?(?=\.$)#\1# and print'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...