Вообще, какие символы в регулярном выражении нужно экранировать?
Например, следующее не является синтаксически правильным:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Это, однако, является синтаксически правильным:
echo '[]' | grep '\[]'
[]
Есть ли документация о том, какие символы следует экранировать в регулярном выражении, а какие нет?
источник
bash
включено),!
все еще развернутым в двойных кавычках, только одиночные кавычки будут останавливать его расширение (или отключать опцию оболочки).]
не следует цитировать,[
не всегда. Я не нашел никаких ссылок на{
и}
Существует несколько типов регулярных выражений, и набор специальных символов зависит от конкретного типа. Некоторые из них описаны ниже. Во всех случаях специальные символы экранируются обратной косой чертой
\
. Например, чтобы соответствовать[
вы пишите\[
вместо. В качестве альтернативы, символы (кроме^
) можно экранировать, заключив их в квадратные скобки один за другим, например[[]
.Символы, которые являются специальными в некоторых контекстах, например
^
специальные в начале (под) выражения, могут быть экранированы во всех контекстах.Как писали другие: в оболочке, если вы не заключаете выражение между одинарными кавычками, вы должны дополнительно экранировать специальные символы для оболочки в уже экранированном регулярном выражении. Пример: вместо
'\['
вас можно написать\\[
(альтернативно:"\["
или"\\["
) в Bourne-совместимых оболочках, таких как bash, но это уже другая история.Основные регулярные выражения (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Расширенные регулярные выражения (ERE)
grep -E
GNU:,sed -r
* BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
источник
grep
использует BRE в качестве метода регулярных выражений. Существует хорошая документация на него здесь , общее краткое изложение было бы «избежать каких - либо специальных символов или метасимволы , чтобы получить его буквального, побег , чтобы создать управляющие последовательности (\n
,\r
и т.д.)», хотя это не всегда так, к примеру, вы должны убежать(
и)
получить их особое значение (обратная ссылка).источник
Оболочка может преобразовать командную строку перед выполнением команды. Обе оболочки и
grep
могут использовать кавычки для удаления специального значения некоторых символов. Тем не менееgrep
и снаряды имеют разные специальные символы. Кроме того, неэкранированные специальные символы, которые не являются результатом существующего расширения, перед выполнением команды удаляются оболочкой.Оболочка передает аргумент
[]
вgrep
и анализируется как выражение с искаженной скобкойgrep
.Выше мы видим похожий случай. Обратная косая черта удаляется и
[]
передается в качестве аргументаgrep
.grep
распознает искаженное выражение скобки.Наконец, в этом случае кавычки удаляются оболочкой и
\[]
передаются в качестве аргумента,grep
но в данном конкретном случае\[
is интерпретируетсяgrep
как буквенная скобка. Кавычки необходимы для предотвращения интерпретации обратной косой черты как специального символа в оболочке.¹ спецификации POSIX .
источник