Различные инструменты и их версии поддерживают разные варианты регулярных выражений. Документация каждого скажет вам, что они поддерживают.
Стандарты существуют, так что можно полагаться на минимальный набор функций, которые доступны во всех соответствующих приложениях.
Например, все современные реализации sedи grepреализации базовых регулярных выражений, как указано в POSIX (по крайней мере, одна версия или другая версия стандарта, но этот стандарт не претерпел существенных изменений в этом отношении за последние несколько десятилетий).
В POSIX BRE и ERE у вас есть [:alnum:]класс персонажа. Это соответствует буквам и цифрам в вашей локали (обратите внимание, что часто включает в себя гораздо больше, чем, a-zA-Z0-9если только локаль не C).
Так:
grep -x '[[:alnum:]_]\{1,\}'
соответствует одному или нескольким alnum или _.
[\w]требуется POSIX для соответствия с обратной косой чертой или w. Таким образом, вы не найдете grepили sedреализации, где это доступно (если только через нестандартные опции).
\wPOSIX не определяет поведение для одних, поэтому реализациям разрешено делать то, что они хотят. 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:]/]в этом случае).