Я мог бы заставить его работать, заменив
#ProxyCommand nohup ssh gw netcat -w1 %h %p
на
ProxyCommand nohup ssh gw -W %h:%p
, который работает для современного OpenSSH. Теперь я не получаю немедленного тайм-аута.
Согласно Руководство пользователя 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
).
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}
будет намного хуже).
Это работает как ожидалось с 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
Я не знаю, какой регекс используется в . Они используют старую версию ERE, согласно ответу Стефана. В любом случае, либо вы используете версию mawk
или POSIX awk
, но я бы предположил, что это BREawk
, которая не реализует ERE, либо в вашем вводе нет строк, содержащих ровно 4 символа. Это может произойти из-за пробельных символов, которые вы не видите, или из-за глифов Юникода, например.