with tutorial starts example egrep regex cygwin grep

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.