Ответ 1
Если вы пытаетесь получить grep
для использования синтаксиса Extended Regular Expression, способ сделать это - использовать grep -E
(aka egrep
). Вы также должны знать о grep -F
(aka fgrep
) и в новых версиях GNU Coreutils grep -P
.
Фон: исходный grep
имел довольно небольшой набор операторов регулярных выражений; это была оригинальная реализация регулярного выражения Кен Томпсона. Новая версия с расширенным репертуаром была разработана позже, а по соображениям совместимости - другое имя. С GNU grep
существует только один двоичный код, который понимает традиционный базовый синтаксис RE, если он вызван как grep
, и ERE, если он вызван как egrep
. Некоторые конструкции из egrep
доступны в grep
с помощью обратного слэша, чтобы ввести специальный смысл.
Впоследствии язык программирования Perl еще больше расширил формализм; этот диалект регулярного выражения, по-видимому, является тем, что большинство новичков ошибочно ожидают поддержки grep
. С grep -P
он делает это; но это еще не широко поддерживается на всех платформах.
Итак, в grep
следующие символы имеют особое значение: ^$[]*.\
В egrep
следующие символы также имеют особое значение: ()|+?{}
. (Скобки для повторения не были в оригинале egrep
.) Скобки для группировки также позволяют обратные ссылки с помощью \1
, \2
и т.д.
Во многих версиях grep
вы можете получить поведение egrep
, поставив обратную косую черту перед специальными предложениями egrep
. Существуют также специальные последовательности, такие как \<\>
.
В Perl было введено огромное количество дополнительных экранов, таких как \w
\s
\d
. В Perl 5 средство регулярного выражения было существенно расширено, с нежелательным соответствием *?
+?
и т.д., Негрупповыми скобками (?:...)
, lookaheads, lookbehinds и т.д.
... Сказав это, если вы действительно хотите преобразовать регулярные выражения egrep
в регулярные выражения grep
без вызова какого-либо внешнего процесса, попробуйте ${regex/pattern/substitution}
для каждого из специальных символов egrep
; но признайте, что это не обрабатывает классы символов, отрицательные классы символов или правильные обратные следы.