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. 🙂