Tengo dos archivos de texto:file1 y file2 , ambos con varias líneas.
$ cat file1
line one
line two
line three
line four
line five
$ cat file2
line A
line B
line C
line D
line E
line F
Me gustaría sustituir un rango de líneas de file1 (de la línea 1_start a la línea 1_end ) con un rango de líneas de file2 (de la línea 2_start a la línea 2_end ).
Por ejemplo, sustituya las líneas 2,4 en file1 con líneas 3,5 de file2 .
Lo que solo pude hacer hasta ahora es extraer las líneas necesarias de file2 con
$ sed -n 3,5p file2
Pero no ayuda ponerlos en file1 . ¿Es posible con sed? ? Si no, ¿es posible con una herramienta similar?
Respuesta aceptada:
sed puede imprimir un rango dado de líneas con algo como esto:
sed -n 'X,Yp' filename
Donde X es la primera línea en un rango y Y es la última línea, ambas inclusive. -n le dice a sed no imprimir nada a menos que se le indique explícitamente que lo haga y eso es lo que p seguir el rango lo hace.
Por lo tanto, puede llamar fácilmente a esto tres veces, agregarlo a un archivo temporal y luego mover ese archivo a donde desee. También puedes combinarlos todos usando cat y procese la sustitución como muestra este ejemplo (estoy usando números de línea que acabo de sacar de la nada; $ es la última línea de un archivo):
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Aquí, estaríamos reemplazando las líneas 6, 7 y 8 en file1 con las líneas 10, 11 y 12 de file2 .
Actualización: Gracias a @MiniMax por señalar que cat y la sustitución del proceso se puede evitar haciendo lo siguiente:
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
BESO, después de todo. 🙂