Necesito encontrar si alguna línea en un archivo comienza **
.
No puedo entender cómo hacerlo porque *
el shell lo interpreta como un comodín.
grep -i "^2" test.out
funciona si la línea comienza con un 2 pero
grep -i "^**" test.out
Obviamente no funciona.
(También necesito saber si esta línea termina con un )
pero aún no lo he intentado).
text-processing
grep
quoting
Shar Hunter
fuente
fuente
*
no necesita escapar en este caso particular, fwiw.grep "^\\*\\*"
para que grep reciba la^\*\*
cadena que necesita para evitar interpretar los asteriscos como cuantificadores de expresiones regulares.Como quería comprobar la línea que comienza
**
y termina con)
, puede combinar dosgrep
operaciones como esta,O con un solo
grep
comando como este,Explicación
^\*\*
: línea de partido que comienza con**
.*
: coincide con todo después**
\)$
: línea de coincidencia que también tiene)
al final de la línea.fuente
No es la cáscara
Ninguna de las respuestas hasta ahora ha tocado el problema real. Sería útil explicar por qué no funciona como espera.
grep -i "^**" test.out
Debido a que usted ha citado el patrón de grep ,
*
está no expandido en la cáscara. Se pasa a grep como está. Esto se explica en la página del manual [1] para bash [2] :Es regular expresiones regulares ordinarias
Una expresión regular es un patrón que describe un conjunto de cadenas.
*
Es uno de los patrones clave en las expresiones regulares. Por defecto, grep lo interpreta de la siguiente manera:Esto significa que su patrón tal como está,
^**
no tiene mucho sentido. Posiblemente trata de hacer coincidir el comienzo de la línea cero o más veces , dos veces. Lo que sea que eso signifique.La solución es citarlo :
grep -i "^\*\*" test.out
[1] No recomiendo leerlo. Por favor, use
man dash
o similar en su lugar.[2] No se dio ningún shell, así que supongo que bash .
fuente
Otras opciones.
Puedes usar
sed
oawk
tambiénPara conocer líneas que terminan con el
)
uso tambiéngrep
osed
oawk
fuente
'/^*\*/&&/)$/'
...Esta es la versión completamente sin comillas:
grep ^\\*\\* test.out
. Para pasar una barra invertida literal del shell a grep, se debe escapar.Esto funciona siempre que no tenga archivos en el directorio que comiencen
^\
y contengan otra barra invertida.fuente