Заставьте awk использовать классы персонажей - PullRequest
4 голосов
/ 28 марта 2012

Как заставить awk распознавать классы символов?

Например, это:

echo "a\n1\nb\n2\nc" | awk '/1/'

выводит 1 как положено, но это:

echo "a\n1\nb\n2\nc" | awk '/\d/'

ничего не выводит там, где я ожидал, что 1 и 2 выживут после фильтра.

Я подумал, что это может быть связано с экранированием оболочки (zsh), но awk '/\\d/' также не работает.

1 Ответ

10 голосов
/ 28 марта 2012

Вы можете попробовать использовать классы прописных символов:

[ghoti@pc ~]$ printf "a\n1\nb\n2\nc\n" | awk '/[[:digit:]]/'
1
2
[ghoti@pc ~]$ 

Насколько я знаю, нотация типа \d на самом деле не является частью ERE, то есть диалектом регулярных выражений, понимаемымбольшинство вариантов awk (а также The One True Awk ).


UPDATE :

Как отмечалось в комментариях, некоторыеВ дистрибутивах Linux может быть установлена ​​mawk, маскирующаяся под awk.mawk - это не то же самое, что awk.Это клон awk с минимальным набором функций, предназначенный скорее для скорости выполнения, чем для функциональности.И несмотря на то, что на своей странице руководства утверждает, что поддерживает расширенные регулярные выражения, mawk не может реализовать "классы" POSIX, такие как [:digit:], [:upper:], [:lower:] и т. Д.

Если вы используете системы, которые предоставляют нестандартные инструменты, такие как mawk вместо стандартных, тогда вы должны ожидать, что вы будете жить в интересные времена.Разработчик сценариев Awk ожидает, что любой двоичный файл в /usr/bin/awk будет вести себя как awk.Если этого не произойдет, система сломана.

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