grep entre dos líneas con una cadena especificada

grep entre dos líneas con una cadena especificada

Tengo este archivo plat simple (file.txt)

a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo

Necesito todas las líneas entre test1 y test2 en dos formularios, el primero crea dos archivos nuevos como

nuevoarchivo1.txt:

test1
abc
cvb
bnm
test2

nuevoarchivo2.txt

test1
def
ijk
xyz
test2

y el segundo formulario crea solo un archivo nuevo como:

nuevoarchivo.txt

test1abccvbbnmtest2
test1abccvbbnmtest2

¿Tiene alguna propuesta?

Para la segunda forma. Yo usé esto

sed -n '/test1/,/test2/p' file.txt > newfile.txt

Pero me da un resultado como

test1abccvbbnmtest2test1abccvbbnmtest2

Necesito una línea de retorno como:

test1abccvbbnmtest2
test1abccvbbnmtest2

Respuesta1

Una frase extraña para el primer caso:

awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt

que dice:

  • Si test1lo encuentra, incremente el número de archivo e inicie la salida (es decir, gire on)
  • Si está activado, imprima la línea con el nombre del archivo "newfileFILE.txt", donde ARCHIVO es el número de archivo.
  • Si test2se encuentra, finalice la salida (es decir, apague)

Luego, puede convertir los dos archivos newfile.txtcon el shell oneliner:

for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt

que dice, para cada archivo, elimine todos los saltos de línea.

Respuesta2

Para su segundo formulario:

sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
  • sed -n '/test1/,/test2/p' file.txt --> capturar texto entre test1 y test2
  • xargs > newfile.txt --> convertir texto en "fila" hablando efectivamente, aunque el propósito de xargs quizás sea diferente.
  • sed 's/test2/&\n/g' newfile.txt --> agregar nueva línea después del patrón "test2"
  • sed -e 's/^[ \t]*//' --> eliminar espacios al inicio de cada línea.

información relacionada