Подтвердить что ты не робот

Выражение Sed не допускает необязательную сгруппированную строку

Я пытаюсь использовать следующее regex в sed script, но оно не работает:

sed -n '/\(www\.\)\?teste/p'

Регулярное выражение, похоже, не работает. sed, похоже, не применяет ? к сгруппированным www\..

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

sed -En '/(www\.)?teste/p'

Это отлично работает, но я хочу запустить этот script на машине, которая не поддерживает оператор -E. Я уверен, что это возможно, и я делаю что-то очень глупое.

4b9b3361

Ответ 1

Стандарт sed понимает только POSIX Основные регулярные выражения (BRE), а не расширенные регулярные выражения (ERE), а ? - метасимвол в ERE, но не в BRE.

Ваша версия sed может поддерживать ERE, если вы включите их. С GNU sed соответствующими параметрами являются -r и --regexp-extended, описанные как "использовать расширенные регулярные выражения в script".

Однако, если ваш sed не поддерживает его - вполне правдоподобный - тогда вы застряли. Либо импортируйте версию sed, которая их поддерживает, либо перепроектируйте вашу обработку. Возможно, вам следует использовать awk.


2014-02-21

Не знаю, почему я не упоминал, что даже если sed не поддерживает сокращенную обозначение ? или \?, она поддерживает подсчитанные диапазоны с \{n,m\}, поэтому вы можете имитировать ? с \{0,1\}:

sed -n '/\(www\.\)\{0,1\}teste/p' << EOF
http://www.tested.com/
http://tested.com/
http://www.teased.com/
EOF

который производит:

http://www.tested.com/
http://tested.com/

Протестировано на Mac OS X 10.9.1 Mavericks со стандартным BSD sed и с GNU sed 4.2.2.