2012-09-29 27 views
52

¿Cómo dar un patrón para una nueva línea en grep? Nueva línea al comienzo, nueva línea al final. No es el modo de expresión regular. Algo así como \ n.¿Cómo dar un patrón para una nueva línea en grep?

+6

No está claro lo que quiere. 'nueva línea al principio' es una línea en blanco y' nueva línea al final' se aplica a cada línea del archivo. Puede publicar un ejemplo? –

+0

En realidad, puedes usar '$'. Es algo limitado, pero utilizable en casos simples. –

+0

https://www.gnu.org/software/grep/manual/grep.html#Usage vea el ítem 15. – jarno

Respuesta

54

grep patrones se combinan con líneas individuales, por lo que no hay forma de que un patrón coincida con una línea nueva que se encuentra en la entrada.

Sin embargo, usted puede encontrar líneas vacías como esto:

grep '^$' file 
grep '^[[:space:]]*$' file # include white spaces 
+0

Al menos GNU grep tiene la opción -z que hace que grep rompa líneas por carácter nulo. Sin embargo, no parece ser compatible con la nueva línea o \ n en el patrón para que coincida con la nueva línea, consulte [informe de errores] (https://bugs.launchpad.net/ubuntu/+source/grep/+bug/1641092). – jarno

+0

@jarno Soporta \ n en patrones con la bandera -P – rubystallion

10

Se puede utilizar de esta manera ...

grep -P '^\s$' file 
  • -P se utiliza para las expresiones regulares de Perl (una extensión de POSIX grep)
  • \s coincide con los espacios en blanco; si va seguido de *, también coincide con una línea vacía.
  • ^ coincide al principio de la línea. $ coincide con el final de la línea.
+1

'-P' es una extensión de GNU.Estoy bien para usarlo cuando la situación lo requiera (normalmente mirar hacia adelante/mirar hacia atrás), pero POSIX grep puede hacer esto solo con '[[: espacio:]]'. – jordanm

+1

Las páginas de manual de grep de FWIW, Solaris y BSD (no verificaron otras) tienen un párrafo para '-P'. GNU es bastante estándar de todos modos. :) –

+0

+1 para perl regex :) – mattexx

59

tratar pcregrep en lugar de regular de grep:

pcregrep -M "pattern1.*\n.*pattern2" filename 

la opción -M permite que coincide a través de múltiples líneas, por lo que puede buscar nuevas líneas como \n.

+0

¡Exactamente estaba buscando, gracias! – yorch

3

En cuanto a la solución (sin usar no portátil -P), puede reemplazar temporal nueva línea con diferente carácter y cambiarlo de nuevo, por ejemplo:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_' 

donde está buscando coincidencia exacta _foo_ donde _ medios \n (entonces __ = \n\n). No tiene que volver a traducirlo por tr '_' '\n', ya que cada patrón se imprimirá en la nueva línea de todos modos, por lo que eliminar _ es suficiente.

0

Gracias a @jarno que sé acerca de la opción -z y descubrí que al usar GNU grep con la opción -P, juego contra \n es posible. :)

Ejemplo:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

imprime bar

Cuestiones relacionadas