En general, ¿qué caracteres en una expresión regular necesitan escapar?
Por ejemplo, lo siguiente no es sintácticamente correcto:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Esto, sin embargo, es sintácticamente correcto:
echo '[]' | grep '\[]'
[]
¿Existe alguna documentación sobre qué caracteres se deben escapar en una expresión regular y cuáles no?
fuente
bash
incluida),!
todavía se expande entre comillas dobles, solo las comillas simples detendrán su expansión (o desactivarán la opción de shell).]
No debe ser citado,[
no siempre. No encontré ninguna referencia{
y}
Existen múltiples tipos de expresiones regulares y el conjunto de caracteres especiales depende del tipo particular. Algunos de ellos se describen a continuación. En todos los casos, los caracteres especiales se escapan por la barra invertida
\
. Por ejemplo, para que coincida[
escribes en su\[
lugar. Alternativamente, los caracteres (excepto^
) podrían escaparse encerrándolos entre corchetes uno por uno como[[]
.Los caracteres que son especiales en algunos contextos como
^
especiales al comienzo de una (sub) expresión se pueden escapar en todos los contextos.Como otros escribieron: en el shell si no encierra la expresión entre comillas simples, tiene que escapar adicionalmente de los caracteres especiales para el shell en la expresión regular que ya escapó. Ejemplo: en lugar de
'\['
usted puede escribir\\[
(alternativamente:"\["
o"\\["
) en shells compatibles con Bourne como bash, pero esta es otra historia.Expresiones Regulares Básicas (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Expresiones regulares extendidas (ERE)
grep -E
GNU:,sed -r
* BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
fuente
grep
usa BRE como su método regex. Hay una buena documentación sobre el mismo aquí , un resumen general sería "escapar cualquier carácter o meta-carácter especial para conseguir su literal, escapar para crear secuencias de escape (\n
,\r
, etc)", aunque esto no siempre es cierto, por ejemplo, tiene que escapar(
y)
obtener su significado especial (referencia).fuente
El shell puede transformar la línea de comando antes de la ejecución del comando. Tanto el shell como el
grep
uso de comillas pueden eliminar el significado especial de algunos caracteres. No obstante,grep
y las conchas tienen diferentes caracteres especiales. Además, el shell elimina los caracteres especiales sin escape que no resultaron de una expansión existente, antes de la ejecución del comando.La cáscara transmite el argumento
[]
agrep
y se analiza como una expresión soporte con formato incorrecto porgrep
.Arriba, podemos ver un caso similar. La barra invertida se elimina y
[]
se transmite como argumento agrep
.grep
reconoce una expresión de corchete con formato incorrecto.Finalmente, en este caso, el shell elimina las comillas y
\[]
se transmite como argumentogrep
pero, en este caso específico, ¹,\[
se interpretagrep
como un paréntesis literal. Se necesitan comillas para evitar que el intérprete interprete la barra invertida como un carácter especial.¹ Especificación POSIX .
fuente