Ich habe zwei Textdateien:file1 und file2 , beide mehrzeilig.
$ 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
Ich möchte einen Bereich ersetzen Zeilen von file1 (ab Zeile 1_start bis Zeile 1_end ) mit einem Bereich Zeilen von file2 (ab Zeile 2_start bis Zeile 2_end ).
Ersetzen Sie beispielsweise die Zeilen 2,4 in file1 mit Zeilen 3,5 aus file2 .
Was ich bisher nur tun konnte, ist, die benötigten Zeilen aus file2 zu extrahieren mit
$ sed -n 3,5p file2
Aber es hilft nicht, sie in file1 zu stecken . Geht das mit sed ? Wenn nicht, ist es mit einem ähnlichen Tool möglich?
Akzeptierte Antwort:
sed kann einen bestimmten Bereich von Zeilen mit etwas wie dem folgenden drucken:
sed -n 'X,Yp' filename
Wobei X erste Zeile in einem Bereich ist und Y ist die letzte Zeile, beide inklusive. -n sagt sed nichts zu drucken, es sei denn, es wird ausdrücklich dazu aufgefordert, und das ist der p nach dem Bereich tut.
Sie können dies also einfach dreimal aufrufen, an eine temporäre Datei anhängen und diese Datei dann an einen beliebigen Ort verschieben. Sie können sie auch alle mit cat kombinieren und verarbeiten Sie die Substitution, wie dieses Beispiel zeigt (ich verwende Zeilennummern, die ich gerade aus dem Nichts gezogen habe; $ ist die letzte Zeile in einer Datei):
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Hier würden wir die Zeilen 6, 7 und 8 in file1 ersetzen mit den Zeilen 10, 11 und 12 aus file2 .
Aktualisierung: Danke an @MiniMax für den Hinweis auf diese cat und die Prozesssubstitution kann wie folgt vermieden werden:
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
Immerhin KISS. 🙂