Em geral, quais caracteres em uma expressão regular precisam ser escapados?
Por exemplo, o seguinte não está sintaticamente correto:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Isso, no entanto, é sintaticamente correto:
echo '[]' | grep '\[]'
[]
Existe alguma documentação sobre quais caracteres devem ser escapados em uma expressão regular e quais não devem?
fonte
bash
incluída),!
ainda é expandido entre aspas duplas, apenas aspas simples interromperão sua expansão (ou desativará a opção de shell).]
não deve ser citado,[
nem sempre. Eu não encontrei nenhuma referência{
e}
Existem vários tipos de expressões regulares e o conjunto de caracteres especiais depende do tipo específico. Alguns deles são descritos abaixo. Em todos os casos, caracteres especiais são escapados por uma barra invertida
\
. Por exemplo, para combinar com[
você , você escreve\[
. Alternativamente, os caracteres (exceto^
) podem ser escapados colocando-os entre colchetes um a um[[]
.Os caracteres que são especiais em alguns contextos, como
^
especiais no início de uma (sub) expressão, podem ser escapados em todos os contextos.Como outros escreveram: no shell, se você não delimitar a expressão entre aspas simples, será necessário escapar adicionalmente dos caracteres especiais do shell no regex já escapado. Exemplo: em vez de
'\['
você pode escrever\\[
(alternativamente:"\["
ou"\\["
) em shells compatíveis com Bourne, como o bash, mas essa é outra história.Expressões regulares básicas (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Expressões regulares estendidas (ERE)
grep -E
GNUsed -r
:, * BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
fonte
grep
usa BRE como seu método regex. Há uma boa documentação sobre ele aqui , um resumo geral seria "escapar de qualquer carácter especial ou metacharacter para obter a sua literal, escapar para criar seqüências de escape (\n
,\r
, etc.)", embora isso nem sempre é verdade, por exemplo, você tem que escapar(
e)
obter seu significado especial (referência anterior).fonte
O shell pode transformar a linha de comando antes da execução do comando. O shell e
grep
pode usar aspas para remover o significado especial de alguns caracteres. No entanto,grep
e conchas têm diferentes caracteres especiais. Além disso, caracteres especiais sem escape que não resultaram de uma expansão existente são removidos, antes da execução do comando, pelo shell.O shell transmite o argumento
[]
paragrep
e é analisado como uma expressão de colchete malformada porgrep
.Acima, podemos ver um caso semelhante. A barra invertida é removida e
[]
é transmitida como argumento paragrep
.grep
reconhece uma expressão de colchete malformada.Finalmente, nesse caso, as aspas são removidas pelo shell e
\[]
são transmitidas como argumento paragrep
, mas, nesse caso específico ¹,\[
são interpretadasgrep
como um colchete literal. São necessárias aspas para impedir a interpretação da barra invertida como um caractere especial pelo shell.¹ especificação POSIX .
fonte