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