¿Cómo dar un patrón para una nueva línea en grep? Nueva línea al principio, nueva línea al final. No es la forma de expresión regular. Algo como \ n.
$
. Es algo limitado, pero se puede utilizar en casos sencillos.
¿Cómo dar un patrón para una nueva línea en grep? Nueva línea al principio, nueva línea al final. No es la forma de expresión regular. Algo como \ n.
$
. Es algo limitado, pero se puede utilizar en casos sencillos.
Respuestas:
grep
los patrones se comparan con líneas individuales por lo que no hay forma de que un patrón coincida con una nueva línea encontrada en la entrada.
Sin embargo, puede encontrar líneas vacías como esta:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
intente en pcregrep
lugar de regular grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
la -M
opción le permite coincidir en varias líneas, por lo que puede buscar nuevas líneas como \n
.
Puedes usar de esta manera ...
grep -P '^\s$' file
-P
se utiliza para expresiones regulares de Perl (una extensión de POSIX grep
).\s
coincidir con los caracteres de espacio en blanco; si le sigue *
, también coincide con una línea vacía.^
coincide con el comienzo de la línea. $
coincide con el final de la línea. -P
es una extensión GNU. Estoy bien para usarlo cuando la situación lo requiere (generalmente mirar hacia adelante / mirar hacia atrás), pero POSIX grep puede hacer esto solo con el archivo [[:space:]]
.
-P
. GNU es bastante estándar de todos modos. :)
brew install grep
obtener GNU grep, que es superior en varios aspectos. apple.stackexchange.com/questions/193288/…
Gracias a @jarno, conozco la opción -z y descubrí que cuando se usa GNU grep con la opción -P, es posible realizar coincidencias\n
. :)
Ejemplo:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Huellas dactilares bar
En cuanto a la solución alternativa (sin usar no portátil -P
), puede reemplazar temporalmente un carácter de nueva línea por otro diferente y volver a cambiarlo, por ejemplo:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Básicamente, busca una coincidencia exacta _foo_
donde _
significa \n
(entonces __
= \n\n
). No tiene que volver a traducirlo tr '_' '\n'
, ya que cada patrón se imprimiría en la nueva línea de todos modos, por lo que eliminarlo _
es suficiente.
<(p paste -sd_ file )
?
new line at the beginning
es una línea en blanco y senew line at end
aplica a todas las líneas del archivo. Puede publicar un ejemplo?