
Necesito encontrar si alguna línea en un archivo comienza con **
.
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 a, )
pero aún no lo he intentado).
Respuesta1
Utilice el \
carácter para escapar del * y convertirlo en un carácter normal.
grep '^\*\*' test.out
También tenga en cuenta las comillas simples '
y no las comillas dobles "
para evitar que el shell expanda las cosas.
Respuesta2
Como desea verificar la línea que comienza **
y termina con )
, puede combinar dos grep
operaciones como esta,
grep '^*\*' test.out | grep ')$'
O con un solo grep
comando como este,
grep -E '^\*\*.*\)$' test.out
Explicación
^\*\*
: línea coincidente que comienza con**
.*
: coincide con todo después**
\)$
: línea coincidente que también tiene)
al final de la línea.
Respuesta3
no es la concha
Ninguna de las respuestas hasta ahora ha tocado el problema real. Sería útil explicarpor quéno funciona como esperabas.
grep -i "^**" test.out
Porque tú tienescitadoel patrón paragrep, *
esnoexpandido por el caparazón. se pasa agrepcomo es. Esto se explica en la página del manual [1] paraintento[2] :
Al encerrar caracteres entre comillas dobles se conserva el valor literal de todos los caracteres entre comillas, con la excepción de $, `, \ y, cuando la expansión del historial está habilitada, !.
Son expresiones regulares ordinarias.
Una expresión regular es unapatrónque describe un conjunto de cadenas.
*
es uno de los patrones clave en las expresiones regulares. Por defecto,greplo interpreta de la siguiente manera:
* The preceding item will be matched zero or more times.
Esto significa que su patrón tal como está ^**
no tiene mucho sentido. Posiblemente intenta coincidir con el comienzo de la línea.cero o más veces, dos veces. Lo que sea que eso signifique.
La solución escitaél:
Cualquier metacarácter con significado especial puede citarse precediéndolo de una barra invertida.
grep -i "^\*\*" test.out
[1] No recomiendo leerlo. Utilice man dash
o similar en su lugar.
[2] No se proporcionó ningún caparazón, así que supongointento.
Respuesta4
Esta es la versión completamente sin comillas: grep ^\\*\\* test.out
. Para pasar una barra invertida literal desde el shell a grep, es necesario utilizar un formato de escape.
Esto funciona siempre que no tenga archivos en el directorio que comiencen ^\
y contengan otra barra invertida.