Linux regex не работает с AWK - PullRequest
0 голосов
/ 25 июня 2018

Ниже регулярное выражение не работает, не могли бы вы помочь исправить то же самое.

Ниже приводится описание моей системы linux:

Linux VMIUAT01.ttsl.com 2.6.18-419.0.0.0.2.el5 #1 SMP Wed Jun 28 20:18:51 PDT 2017 x86_64 x86_64 x86_64 GNU/Linux

В случае 1 и 2 введен правильный текст, но по-прежнему выдается сообщение об ошибке.

Для case3 введен неправильный текст, но не получен ответ об ошибке

вариант 1: код

echo "TT07PMTP0600" | gawk '{if ($1 !~ /[A-Z]{2}[0-9]{2}[A-Z]{4}[0-9]{4}/) {print "Error 203: Unique Record ID No contains Non Alphanumeric values,Field position 3, Linenumber:"NR,$0}}'

вывод: введен правильный текст, но все равно получен ответ об ошибке.

Error 203: Unique Record ID No contains Non Alphanumeric values,Field position 3, Linenumber:1 TT07PMTP0600

дело 2:

код

echo "22-Jun-18" | awk '{if ($1 !~ /^[0-9]{2}\-[A-Za-z]{3}\-[1-9]{2}$/) {print "Error 213: Date of Reporting contains Non Alphanumeric values,Field position 13, Linenumber:"NR,$0}}'

вывод: введен правильный текст, но по-прежнему выдается сообщение об ошибке.

Error 213: Date of Reporting contains Non Alphanumeric values,Field position 13, Linenumber:1 22-Jun-18

дело 3:

код

echo "product stv," | awk '{if ($1 ~ /^[^A-Za-z0-9 ]+$/) {print "Error 201: Tariff Product DataType contains Non Alphanumeric values,Field position 1, Linenumber:"NR,$0}}'

Вывод: введен неверный текст, но не получен ответ об ошибке

No result, no error thrown

1 Ответ

0 голосов
/ 25 июня 2018

Кажется, что вы используете интервальные выражения для своих регулярных выражений. В зависимости от версии gawk, которую вы используете, вы должны использовать флаг --re-interval В руководстве GNU awk указано:

Интервальные выражения традиционно не были доступны в awk. Oни были добавлены как часть стандарта POSIX, чтобы сделать awk и egrep в соответствии друг с другом.

Изначально, поскольку старые программы могут использовать ‘{’ и ‘}’ в регулярном выражении констант, gawk не соответствует интервальным выражениям в регулярных выражениях.

Однако, начиная с версии 4.0 , gawk соответствует интервалу выражения по умолчанию. Это потому, что совместимость с POSIX имеет стать более важным для большинства пользователей gawk, чем совместимость со старыми программы.

Итак, если у вас более старая версия (проверьте с awk --version), рекомендуется добавить --re-interval. Если вы используете --posix, вы отключите все расширения GNU, которые могут пригодиться.

man awk (версия 3.1.7): --re-interval Включить использование интервальных выражений при сопоставлении регулярных выражений (см. Регулярные выражения ниже). Интервальные выражения традиционно недоступны на языке AWK. Стандарт POSIX добавил их, чтобы сделать awk и egrep согласованными друг с другом. Однако их использование может привести к поломке старых программ AWK, поэтому gawk предоставляет их только в том случае, если они запрашиваются с помощью этой опции или когда указано --posix.

  • Корпус 1 и Корпус 2 : (версия <4.0): </p>

    $ echo "TT07" | gawk '/[A-Z]{2}[0-9]{2}/{print "match";exit}{print "no match"}'
    no match
    $ echo "TT07" | gawk --re-interval '/[A-Z]{2}[0-9]{2}/{print "match";exit}{print "no match"}'
    match
    
  • Дело 1 и Дело 2 : (версия & ge; 4.0):

    $ echo "TT07" | gawk '/[A-Z]{2}[0-9]{2}/{print "match";exit}{print "no match"}'
    match
    
  • Случай 3 : это совершенно другой вопрос, который хорошо объяснен в комментариях cdrake .

    Случай 3 будет совпадать, потому что awk разделяется на пустое пространство и поэтому $1 является только «продуктом», он не включает запятую. Даже если вы использовали $0, тогда текст целом должен быть неправильным, а не только один символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...