Me gustaría buscar texto que se pueda dividir en varias líneas en un archivo. Un grep que ignoraría los saltos de línea y devolvería el intervalo de líneas correspondiente.
por ejemplo, estaría buscando is an example file
y espero que se encuentre en el siguiente archivo:
Este es
un
archivo de ejemplo.
No depender de espacios iniciales o finales, ignorar por completo todas las formas de espacio en blanco podría ser lo mejor (idealmente, tratar cualquier secuencia de espacio en blanco como un solo espacio).
Una solución no ideal es tr '\n' ' ' | grep
que discrimina entre coincidencias y no coincidencias, pero no muestra la coincidencia ni trata bien los archivos grandes.
text-processing
grep
search
newlines
Nikana Reklawyks
fuente
fuente
isearch-forward
)/This\_sis
. Para más detalles::help \_s
.Respuestas:
GNU
grep
puede hacerloPara cumplir algunos puntos que surgen en los comentarios, hay algunas modificaciones al script:
Con respecto a los archivos de gran tamaño, no tengo imaginación para limitar la memoria, pero en caso de problemas, puede usarlos libremente
sed
que mantienen no más de 4 líneas (porque 4 palabras en el patrón) en la memoria (
\(\n.*\)\{3\}
).fuente
-z
opción le dicegrep
que trate las nuevas líneas como caracteres de texto ordinarios y busque bytes nulos para separar los registros. En un archivo de texto sin bytes nulos (es decir, el caso típico),grep -z
tratará todo el archivo como una línea. Entonces (1) esto plantea la pregunta de qué tan bien puede manejar archivos grandes, y (2) si encuentra una coincidencia, escribirá todo el archivo, sin dar pistas sobre la ubicación de la coincidencia. Además (3) el OP dijo: "idealmente, tratar cualquier secuencia de espacio en blanco como un solo espacio", por lo que debe usar\s+
y agregar-E
.-o
; Me sigo olvidando de eso. Manera inteligente de usarlo. (1)grep
Comienza su nueva respuesta^[\n]*
; eso es un error tipográfico para[^\n]*
. (2) dije\s+
deliberadamente.be\s*little
coincidirábelittle
ycare\s*less
coincidirácareless
. Pero supongo que es un problema menor. Y, si usted no desea utilizar-E
, puede utilizar “la versión del hombre pobre” de\s+
, a saber,\s\s*
. (3) Buensed
comando. Puede fallar si hay líneas en blanco (por lo que la frase de cuatro palabras puede extenderse en más de cuatro líneas); Pude arreglar eso agregandos/\n\s*\n/\n/
.-E
ti acero capaz de usar+
en\s\+
forma. Las líneas vacías dentro del patrón parecen ser artificiales.grep
frases.Prueba esto:
fuente
\s
5 veces si busco "este es un patrón muy largo"?\s
corresponde a espacios, y la nueva línea es un "espacio".This\nis a very\nlong pattern
, y no sé dónde pueden ocurrir los saltos de línea. Tendría que buscarThis\sis\sa\svery\slong\spattern
, ¿verdad? (que se vuelve tedioso a medida que aumenta la longitud del patrón o se pega desde otro lugar)pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
.