
Tengo un contenido de archivo similar a:
A+B
C+D
A+B
Estas son cuerdas. Quiero buscar la aparición de A+B
. Entonces escribo el comando como: grep 'A+B' test.txt
. Sin embargo, ¿si escribo grep 'A\+B' test.txt
no obtengo ningún resultado? Mientras que si en lugar de +
la cadena contiene .
, si agrego \
o no agrego, obtengo los resultados de la búsqueda. No comprendo:
1) Cuándo debo agregar \
y cuándo no.
2) ¿Por qué no obtuve ningún resultado cuando lo agregué +
mientras obtuve resultados cuando lo agregué?.
Respuesta1
No especificaste qué sabor grep
usas, pero es posible que uses GNU grep
. Por defecto grep
usa Basic Regular Expressions
, y como se explica en man grep
:
Expresiones regulares básicas versus extendidas
En expresiones regulares básicas, los metacaracteres ?, +, {, |, (,
y ) pierden su significado especial; en su lugar, utilice las
versiones con barra invertida \?, +, {, \|, ( y ).
Tenga en cuenta que si usara, -E
cambiaría a Extended Regular Expressions (ERE)
y tendría que usar \+
porque, de forma predeterminada, in
ERE
y muchas otras sintaxis de expresiones regulares +
significan one or more of the preceding character
:
$ grep -E 'A\+B' test.txt
A+B
A+B
Entonces, para responder a tus preguntas:
Debe utilizarlo
\
cuando desee buscar caracteres literales.En
BRE
un solo punto significaany character
lo mismo que enERE
.
Respuesta2
En egrep
(o grep -E
) las expresiones regulares extendidas están habilitadas. Éstas incluyen:
+ - match one or more instances of the previous match pattern.
Estos se pueden usar en modo básico grep
con una barra invertida precedente, que no tiene su significado habitual de hacer literal, pero invoca la egrep
función.
Entonces los siguientes son equivalentes: -
egrep 'A+B'
grep 'A\+B'
En ambos casos, la coincidencia es para uno o más A
s seguidos inmediatamente de B
.
Debido a que egrep
hay un significado especial para '+', se debe utilizar un formato de escape para que coincida literalmente, por lo que lo siguiente también es equivalente:
egrep 'A\+B'
grep 'A+B'
Ambos coincidirán A+B
, ya que en ambos casos se busca un '+' literal.
Otras egrep
funciones que se pueden usar al escapar grep
incluyen \|
cadenas de coincidencia alternativas y \{M,N\}
, donde M y N son números que representan el mínimo y el máximo de repeticiones en un patrón de coincidencia. Estos no se escapan en egrep
.