Различные инструменты и их версии поддерживают разные варианты регулярных выражений. Документация каждого скажет вам, что они поддерживают.
Стандарты существуют, так что можно полагаться на минимальный набор функций, которые доступны во всех соответствующих приложениях.
Например, все современные реализации sed
и grep
реализации базовых регулярных выражений, как указано в POSIX (по крайней мере, одна версия или другая версия стандарта, но этот стандарт не претерпел существенных изменений в этом отношении за последние несколько десятилетий).
В POSIX BRE и ERE у вас есть [:alnum:]
класс персонажа. Это соответствует буквам и цифрам в вашей локали (обратите внимание, что часто включает в себя гораздо больше, чем, a-zA-Z0-9
если только локаль не C).
Так:
grep -x '[[:alnum:]_]\{1,\}'
соответствует одному или нескольким alnum или _.
[\w]
требуется POSIX для соответствия с обратной косой чертой или w
. Таким образом, вы не найдете grep
или sed
реализации, где это доступно (если только через нестандартные опции).
\w
POSIX не определяет поведение для одних, поэтому реализациям разрешено делать то, что они хотят. GNU grep
добавил, что давно.
В GNU grep
раньше был собственный движок регулярных выражений, однако теперь он использует GNU libc (хотя он и встраивает свою собственную копию).
Он предназначен для совпадения чисел и подчеркивания в вашем регионе. Однако в настоящее время в нем есть ошибка, заключающаяся в том, что он соответствует только однобайтовым символам (например, не é в локали UTF-8, даже если это явно буква и даже соответствует é во всех локалях, где é является одиночным персонаж).
Также есть \w
оператор регулярного выражения в регулярном выражении perl и в PCRE. PCRE / perl не являются регулярными выражениями POSIX, это просто еще одна вещь.
Теперь, когда GNU grep -P
использует PCRE, у него та же проблема, что и без -P
. Это можно обойти там, хотя с помощью (*UCP)
(хотя это также имеет побочные эффекты в локалях не-UTF8).
GNU sed
также использует регулярные выражения GNU libc для своих собственных регулярных выражений. Он использует его таким образом, что в нем нет той же ошибки, что и в GNU grep
.
GNU sed
не поддерживает PCRE. В коде есть некоторые доказательства того, что он был предпринят ранее, но, похоже, он больше не стоит на повестке дня.
Если вы хотите регулярные выражения Perl, просто используйте perl
хотя.
В противном случае, я бы сказал, что вместо того, чтобы пытаться полагаться на поддельную нестандартную функцию вашей конкретной реализации sed
/ grep
, лучше придерживаться стандарта и использовать его [_[:alnum:]]
.
[_[:alnum:]]
хороший обходной путь, который позволяет мне расширять его так же, как[\w/]
([_[:alnum:]/]
в этом случае).