Cómo encontrar líneas que comienzan con **

Cómo encontrar líneas que comienzan con **

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 grepoperaciones como esta,

grep '^*\*' test.out | grep ')$'

O con un solo grepcomando 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 dasho 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.

información relacionada