Сделать awk использовать классы символов


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

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

echo "an1nbn2nc" | awk '/1/'

Выводит 1 как и ожидалось, но это:

echo "an1nbn2nc" | awk '/d/'

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

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

1 3

1 ответ:

Можно попробовать использовать классы символов с прописными буквами:

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

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


Обновление :

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

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