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
test1
lo encuentra, incremente el número de archivo e inicie la salida (es decir, gireon
) - Si está activado, imprima la línea con el nombre del archivo "newfileFILE.txt", donde ARCHIVO es el número de archivo.
- Si
test2
se encuentra, finalice la salida (es decir, apague)
Luego, puede convertir los dos archivos newfile.txt
con 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.