¿Cómo puedo buscar dos frases diferentes cuando están en dos líneas diferentes usando un solo grep
comando?
Por ejemplo
Línea 1: Esto es un dulce.
Línea 2: limón.
Usé esto pero ningún resultado
grep "sweet.*lemon" file_type
¿Cómo puedo buscar dos frases diferentes cuando están en dos líneas diferentes usando un solo grep
comando?
Por ejemplo
Línea 1: Esto es un dulce.
Línea 2: limón.
Usé esto pero ningún resultado
grep "sweet.*lemon" file_type
Respuestas:
Para usar grep
dos líneas diferentes, busque ambos patrones
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
O usa alternancia
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Para obtener la siguiente línea después de un patrón, puede usar la opción de contexto
$ grep -A1 sweet file_type
This is a sweet
lemon.
Pero si usted está buscando de forma explícita para un patrón de líneas múltiples, eso es porque complicado grep
piensa en líneas ... . Su .*
capturará todo lo que entre "dulce" y "limón" en la línea . Podemos obtener "limón" en la siguiente línea con el -P
uso \n
para que coincida con la nueva línea y al decir que grep
el archivo está nulo separado con -z
:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-E
Use expresiones regulares extendidas (para usar |
caracteres para alternar sin necesidad de escapar)-An
Imprima líneas adicionales después del patrón, donde n es el número de líneas finales para imprimir-P
Utilice expresiones regulares de estilo perl ("experimental" en grep
- instalarpcregrep
lugar para un mejor soporte de perl)-z
Use el carácter nulo como separador (solo finge en este caso, pero grep
tomará nuestra palabra)-o
solo imprime la parte coincidente-o
... editado ...
grep: The -P and -z options cannot be combined
- por ejemplo, grep (GNU grep) 2.5.1 en RHEL
Me gusta esto:
grep "sweet\|lemon"
grep
por defecto funciona en "modo estándar", donde "caracteres especiales" |
, como +
, *
se interpretan literalmente a menos que estén enmascarados con una barra diagonal inversa. Ver por ejemplo esta respuesta . Para usar la forma en que probablemente esté acostumbrado, que los "caracteres especiales" necesitan ser enmascarados para ser interpretados literalmente, necesita cambiar al "modo extendido" ( grep -E
). Tal vez Madneon podría dar más detalles sobre sus respuestas, por ejemplo, ¿qué habría intentado con los OP ?
grep -zP
comando funcionaría en este caso específico (un archivo que consta de exactamente dos líneas), en general consideraría que cualquier archivo separado por una nueva línea es una sola línea, por lo tanto, volcar todo el contenido del archivo (si hay una coincidencia en alguna parte) o nada; por lo general, eso no es lo que la gente usagrep
.