awk повторение {n} не работает

Я мог бы заставить его работать, заменив

#ProxyCommand nohup ssh gw netcat -w1 %h %p

на

ProxyCommand nohup ssh gw -W %h:%p

, который работает для современного OpenSSH. Теперь я не получаю немедленного тайм-аута.

18
29.03.2017, 15:07
3 ответа

Согласно Руководство пользователя GNU Awk: История возможностей , поддержка операторов диапазона регулярных выражений была добавлена ​​в версии 3.0, но изначально требовалась явная параметр командной строки

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

  • Новые параметры командной строки:
    • Параметр --lint-old для предупреждения о конструкциях, которые недоступны в исходная версия awk для Unix версии 7 (см. V7 / SVR3.1).
    • Параметр -m из BWK awk.(Брайан в то время все еще работал в Bell Laboratories.) Позднее это было удалено как из его awk, так и из gawk.
    • Параметр --re-interval для предоставления интервальных выражений в регулярных выражениях (см. Операторы регулярных выражений).
    • Параметр --traditional был добавлен как лучшее название для --compat (см. Параметры).

В gawk 4.0,

Интервальные выражения стали частью регулярных выражений по умолчанию

Поскольку вы используете gawk 3.x, вам нужно будет использовать

awk --re-interval '/^.{4}$/'

или

awk --posix '/^.{4}$/'

или (спасибо @ StéphaneChazelas), если вам нужно переносимое решение, используйте

POSIXLY_CORRECT=anything awk '/^.{4}$/'

(так как - posix или - повторный интервал вызовет ошибку в других реализациях awk ).

20
27.01.2020, 19:45

ERE ( расширенные регулярные выражения , используемые awk или egrep ) изначально не были нет {x, y} . Впервые он был введен в BRE (как используется grep или sed ), но с синтаксисом \ {x, y \} , который не прерывается назад портативность.

Но когда он был добавлен к ERE с синтаксисом {x, y} , он действительно нарушил обратную переносимость, поскольку foo {2} RE раньше соответствовал чему-то другому.

Поэтому некоторые реализации предпочли этого не делать.Вы обнаружите, что / bin / awk , / bin / nawk и / bin / egrep в Solaris по-прежнему не соблюдают его (вам нужно использовать / usr / xpg4 / bin / awk или / usr / xpg4 / bin / grep -E ). То же самое для awk и nawk на FreeBSD (на основе awk , поддерживаемого Брайаном Керниганом ( k в awk )).

Для GNU awk до относительно недавнего времени (версия 4.0) вам приходилось вызывать его с помощью POSIXLY_CORRECT = something awk '/^.{4}$/', чтобы он почитай это. mawk все еще не соблюдает его .

Обратите внимание, что этот оператор является лишь синтаксическим сахаром. . {3,5} всегда можно записать ....?.? , например (хотя, конечно, {3,5} намного больше разборчиво, и эквивалент (foo. {5,9} bar) {123,456} будет намного хуже).

20
27.01.2020, 19:45

Это работает как ожидалось с GNU awk (gawk):

$ printf 'abcd\nabc\nabcde\n' | gawk '/^.{4}$/'
abcd

Но не работает с mawk, который ближе к POSIX awk и, AFAIK, используется по умолчанию в системах Ubuntu:

$ printf 'abcd\nabc\nabcde\n' | mawk '/^.{4}$/'
$ ## prints nothing

Итак, простым решением будет использование gawk вместо awk. Нотация {n} не является частью синтаксиса POSIX BRE (базового регулярного выражения). Вот почему grep также не работает здесь:

$ printf 'abcd\nabc\nabcde\n' | grep '^.{4}$'
$

Однако оно является частью ERE (расширенных регулярных выражений):

$ printf 'abcd\nabc\nabcde\n' | grep -E '^.{4}$'
abcd

Я не знаю, какой регекс используется в mawk или POSIX awk, но я бы предположил, что это BRE. Они используют старую версию ERE, согласно ответу Стефана. В любом случае, либо вы используете версию awk, которая не реализует ERE, либо в вашем вводе нет строк, содержащих ровно 4 символа. Это может произойти из-за пробельных символов, которые вы не видите, или из-за глифов Юникода, например.

6
27.01.2020, 19:45

Теги

Похожие вопросы