Сделать awk использовать классы символов
Как заставить awk распознавать классы символов?
Например, это:
echo "an1nbn2nc" | awk '/1/'
Выводит 1
как и ожидалось, но это:
echo "an1nbn2nc" | awk '/d/'
Ничего не выводит там, где я ожидал, что и 1
, и 2
переживут фильтр.
Я думал, что это может быть связано с Shell escaping (zsh), но awk '/\d/'
также не работает.
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. Если этого не произойдет, система будет сломана.