Следует ли избегать (и) в регулярных выражениях с помощью GNU sed - PullRequest
19 голосов
/ 17 июня 2011

Я заметил несколько постов на этом сайте, в которых говорится, что с gnu sed вы должны использовать ( и ) в регулярных выражениях, а не \( и \).Но потом я заглянул в руководство gnu sed и увидел, что они указывают, что \( и \) должны использоваться.Что случилось?

Ответы [ 4 ]

24 голосов
/ 17 июня 2011

В этой части руководства gnu sed, с которой вы связались , объясняется, что вопрос о том, следует ли вам избегать скобок, зависит от того, используете ли вы базовые регулярные выражения или расширенные регулярные выражения. Эта часть говорит, что флаг -r определяет, в каком режиме вы находитесь.

Редактировать: , как указано в комментарии grok12, флаг -E в bsd sed делает то же, что флаг -r в gnu sed.

14 голосов
/ 17 июня 2011

Изначально sed, как и grep и все остальное, использовал \ (для обозначения группировки, тогда как (соответствовал буквальному открытому пареню.

Многие новые реализации регулярных выражений, в том числе egrep и perl, переключили это, поэтому \ (означало буквальный open-paren, и (использовалось для указания группировки.

Так что теперь с gnu sed (это специальный символ; точно так же, как egrep. Но в других системах (например, BSD), насколько я могу судить, это все еще старый способ. К сожалению, это настоящий беспорядок, потому что теперь это Трудно понять, какой из них использовать.

8 голосов
/ 17 июня 2011

Благодаря рокеру, Мурге и Крису.Каждый из вас помог мне понять проблему.Я отвечаю на свой вопрос здесь, чтобы (надеюсь) собрать всю историю в одном месте.

Существует две основные версии sed: gnu и bsd.Оба из них требуют, чтобы в базовом регулярном выражении были экранированные символы при использовании для группировки, но не при использовании в расширенном регулярном выражении.Они отличаются тем, что опция -r включает расширенное регулярное выражение для gnu, а -E - для bsd.

Стандартным sed в Mac OSX является bsd.Я полагаю, что большая часть остального мира использует gnu sed в качестве стандарта, но я не знаю точно, кто что использует.Если вы не уверены, какой метод используете, попробуйте:

> sed -r

Если вы получили ответ

> sed: illegal option -- r

, значит, у вас есть bsd.

5 голосов
/ 17 июня 2011

Экранированные круглые скобки (\() делают поиск регулярных выражений круглыми скобками как частью выражения.

Неэкранированные круглые скобки (() заставляют регулярное выражение группировать содержимое скобок.

Другими словами, если вы избегаете их, механизм ищет их , но если вы оставляете их как есть, они заставляют механизм группировать результаты в переменные.

Примерпродемонстрировать:

$myString = "junk(150)moar";

Чтобы получить только число:
#^\w+\((\d+)\)\w+$#

($1 is 150)

Это беспорядок, я знаю, но он демонстрирует использование группировки скобок и скобок в качестве части соответствующего выражения .

Обновить годы спустя:

Поскольку пользователь @ bmk правильно указывает , этот ответ применяется к расширенным регулярным выражениям, но не к основным регулярным выражениям.Трудно найти базовые регулярные выражения в качестве механизма синтаксического анализа по умолчанию в большинстве языков программирования и т. Д., Но было бы разумно проверить, какой механизм вы используете, прежде чем предполагать, что этот ответ будет применяться в вашей ситуации.

...