Ho due file di testo:file1
e file2
, entrambi con più righe.
$ 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
Vorrei sostituire un intervallo di righe di file1
(dalla riga 1_start
alla riga 1_end
) con un intervallo di righe di file2
(dalla riga 2_start
alla riga 2_end
).
Ad esempio, sostituisci le righe 2,4
in file1
con righe 3,5
da file2
.
Quello che ho potuto fare solo fino ad ora è estrarre le righe necessarie da file2
con
$ sed -n 3,5p file2
Ma non aiuta inserirli in file1
. È possibile con sed
? In caso negativo, è possibile con uno strumento simile?
Risposta accettata:
sed
può stampare un determinato intervallo di righe con qualcosa del genere:
sed -n 'X,Yp' filename
Dove X
è la prima riga in un intervallo e Y
è l'ultima riga, entrambe incluse. -n
dice a sed
non stampare nulla a meno che non venga esplicitamente detto di farlo ed è ciò che il p
segue l'intervallo.
Quindi puoi facilmente chiamarlo tre volte, aggiungendo un file temporaneo, quindi sposta quel file dove vuoi. Puoi anche combinarli tutti usando cat
ed elaborare la sostituzione come mostra questo esempio (sto usando numeri di riga che ho appena tirato fuori dal nulla; $
è l'ultima riga di un file):
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Qui sostituiremmo le righe 6, 7 e 8 in file1
con le righe 10, 11 e 12 da file2
.
Aggiornamento: Grazie a @MiniMax per aver segnalato quel cat
e la sostituzione del processo può essere evitata procedendo come segue:
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
BACIO, dopotutto. 🙂