
Die folgende Methode zum Einfügen von Dateien sed
funktionierte früher, sogar vor der letzten Zeile, aber jetzt nicht mehr. Ist das ein Fehler in der aktuellen sed
?
Demo der Methode zum Einfügen von Dateien mit sed:
mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2
$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten
$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3
$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3
$ sed --version
GNU sed version 4.2.1
...
Das heißt, die Methode zum Einfügen einer Datei vor der Zeile funktioniert überall außer in der letzten Zeile. Früher hat es funktioniert. Ist das ein Fehler in der aktuellen Version sed
?
Danke
Antwort1
Da Sie auf sind, gnu sed
könnten Sie verwenden
'e [COMMAND]'
This command allows one to pipe input from a shell command into
pattern space.
in der letzten $
Zeile:
sed '$e cat insert.txt' file
Mit ed
(ersetzen Sie ,p
es durch w
, wenn Sie direkt bearbeiten möchten):
ed -s file<<IN
- r insert.txt
,p
q
IN
oder
ed -s file <<< $'-1 r insert.txt\n,p\nq\n'
Beim ed
Lesen file
wird die aktuelle Adresse auf die letzte $
Zeile gesetzt. -
(oder -1
) setzt die aktuelle Adresse auf eine Zeile davor (also $-1
) und r
liest insert.txt
bis nach der aktuellen Zeile. ,p
druckt den Inhalt des Textpuffers (wie gesagt, ersetzen Sie es durch, w
um die Änderungen zu speichern) und q
beendet den Editor.
Antwort2
Laut Ihrem Kommentar „MÜSSEN SieSpiel gegen die letzte Zeile", daher würde ich erwägen, $
(letzte Zeile) und i
(Befehl einfügen) in zu verwenden sed
. Beispiel:
sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5
Stellen Sie einfach sicher, dass die Datei keine leere Zeile als letzte Zeile hat, dann sollte es funktionieren. Beachten Sie das Leerzeichen zwischen dem Dollarzeichen und dem i
und dem Backslash ( \
) nach dem i
. Dadurch wird der Text nach dem Backslash in die letzte Zeile eingefügt, ohne dass für die letzte Zeile ein a erforderlich ist /pattern/
.
HINWEIS: Dieser Befehl fügt vor der letzten Zeile nur eine Textzeile hinzu, keine Datei. Wenn Sie den Inhalt einer Datei vor der letzten Zeile einfügen möchten.
Wenn Sie eine ganze Datei hinzufügen möchten (und das möchten Sie nicht, wenn sie in ist sed
), würde ich Folgendes verwenden:
head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt
Dies sollte alles außer der letzten Zeile anzeigen, dann cat
die inserted_file.txt
und dann die letzte Zeile der first_file.txt
.