regex - tutorial - grep: coincidencia en el literal "+"
grep tutorial (2)
GNU grep (que se incluye en Cygwin) admite dos sintaxis para expresiones regulares: básica y extendida. grep
usa expresiones regulares básicas y egrep
o grep -E
utiliza expresiones regulares extendidas. La diferencia básica, del manual grep , es la siguiente:
En expresiones regulares básicas los metacaracteres
?
,+
,{
,|
,(
y)
pierden su significado especial; en su lugar, use las versiones backslashed/?
,/+
,/{
,/|
,/(
y/)
.
Dado que desea el significado ordinario de los caracteres (
+
)
, cualquiera de las dos formas siguientes debería funcionar para su propósito:
grep "(+)" * # Basic
egrep "/(/+/)" * # Extended
Necesito encontrar apariciones de "(+)" en mis scripts sql (es decir, expresiones de unión externa de Oracle). Al darme cuenta de que "+", "(" y ")" son todos caracteres especiales de expresión regular, probé:
grep "/(/+/)" *
Ahora esto devuelve ocurrencias de "(+)", pero también otras líneas. (Aparentemente cualquier cosa con parens abiertos y cercanos en la misma línea.) Recordando que los parens son solo especiales para grep extendido, probé:
grep "(/+)" * grep "(//+)" *
Ambas devuelven solo líneas que contienen "()". Entonces, suponiendo que "+" no se puede escapar, intenté con un viejo truco:
grep "([+])" *
Eso funciona. Verifiqué el resultado con una herramienta no regex.
Pregunta : ¿Alguien puede explicar qué está pasando exactamente con el carácter "+"? ¿Hay alguna forma menos complicada de combinar en "(+)"?
(Estoy usando el comando cygwin grep).
EDITAR : Gracias por las soluciones. - Y ahora veo que, según el manual grep de GNU al que se refirió Bruno, " /+
" cuando se usa en una expresión básica le da a "+" su significado extendido , y por lo tanto coincide con uno o más "(" seguido por un ")". Y en mis archivos eso siempre es "()".
Probablemente necesites agregar algunas barras invertidas porque el caparazón las está tragando.
ETA: En realidad, acabo de probar mi Cygwin y grep "(+)"
parece funcionar bien para lo que quieres.