sed, Datei vor der letzten Zeile einfügen

sed, Datei vor der letzten Zeile einfügen

Die folgende Methode zum Einfügen von Dateien sedfunktionierte 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 sedkö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 ,pes 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 edLesen filewird die aktuelle Adresse auf die letzte $Zeile gesetzt. -(oder -1) setzt die aktuelle Adresse auf eine Zeile davor (also $-1) und rliest insert.txtbis nach der aktuellen Zeile. ,pdruckt den Inhalt des Textpuffers (wie gesagt, ersetzen Sie es durch, wum die Änderungen zu speichern) und qbeendet 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 iund 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 catdie inserted_file.txtund dann die letzte Zeile der first_file.txt.

verwandte Informationen