Различные инструменты и их версии поддерживают разные варианты регулярных выражений. Документация каждого скажет вам, что они поддерживают.
Стандарты существуют, так что можно полагаться на минимальный набор функций, которые доступны во всех соответствующих приложениях.
Например, все современные реализации 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:]/]
в этом случае).grep
.Вы правы -
\w
это часть PCRE - perl-совместимых регулярных выражений. Это не часть «стандартного» регулярного выражения. http://www.regular-expressions.info/posix.htmlНекоторые версии
sed
могут поддержать его, но я хотел бы предложить самый простой способ это просто использоватьperl
вsed
режиме, указав-p
флаг. (Вместе с-e
). (Подробнее вperlrun
)Но вам не нужно
[]
обходиться этим в этом примере - это для групп правильных вещей.Или на Windows:
Смотрите
perlre
для более PCRE вещи.Вы можете получить Perl здесь: http://www.activestate.com/activeperl/downloads
источник
\w
и[\w]
в моем вопросе. Я обновлю его выводами каждой команды, чтобы было понятно, какая из них работает, а какая нет. В частности,sed
понимает\w
, но нет[\w]
. Кроме того, мне нужно[\w]
работать, потому что я хочу использовать,[\w/]
например.perl
можете сделать это :).\w
был в GNU grep (в 80-х) до того, как быть в Perl, а в GNU emacs, вероятно, даже до этого.Я подозреваю, что
grep
иsed
по-разному решаем, когда применять[]
и когда расширять\w
. В Perl регулярное выражение\w
означает любой символ слова и[]
определяет группу для применения любого из символов в качестве совпадения. Если вы «развернете»\w
ранее, то[]
это будет класс символов всех символов слова. Если вместо этого вы[]
сначала сделаете, у вас будет класс символов с двумя символами,\
иw
он будет соответствовать любому шаблону, содержащему один или несколько из этих двух символов.Таким образом, кажется, что
sed
он видит[]
и обрабатывает его как содержащий точные символы для сопоставления вместо того, чтобы соблюдать особую последовательность,\w
какperl
иgrep
делают. Конечно,[]
в этом примере они совершенно не нужны, но можно представить себе случаи, когда это было бы важно, но тогда вы могли бы заставить его работать с паренами и / или.источник
\
это escape-код, и вы бы использовали его для экранирования. По своей сути это означает, что он должен иметь более высокий приоритет, чем любая другая вещь. Я думаю, что более вероятно, что это не реализовано, потому что\w
не является частью спецификации регулярных выраженийecho whe\\ere | sed -r 's/[\w]+/gone/g
дает мне,gonehegoneere
как будто он соответствует каждому из` and
w` и делает замену