Lassen Sie mich den Newline-Charakter klarstellen:
$ echo Hello > file1 ; cat file1
Hello
$ echo -n Hello > file2 ; cat file2
Hello$
Hier sehen Sie, dass file1
am Ende ein Zeilenumbruchszeichen steht, das file2
aber nicht steht.
Angenommen, ich habe einen file
:
$ cat file
Hello
Welcome to
Unix
$
Und ich möchte and Linux
am Ende der Datei hinzufügen , dann echo " and Linux" >> file
wird zu newline hinzugefügt. Aber ich möchte die letzte Zeile alsUnix and Linux
Um das Problem zu umgehen, möchte ich das Zeilenumbruchzeichen am Ende der Datei entfernen. Daher Wie entferne ich das Newline-Zeichen am Ende der Datei?
sed '$s/$/ and linux/'
Antworten:
Wenn Sie nur Text in die letzte Zeile einfügen möchten, ist das mit sed ganz einfach. Ersetzen Sie
$
(Musterübereinstimmung am Ende der Zeile) durch den Text, den Sie hinzufügen möchten, nur für Zeilen im Bereich$
(dh die letzte Zeile).was unter Linux zu verkürzen ist
Wenn Sie das letzte Byte in einer Datei entfernen möchten, bietet Linux (genauer gesagt GNU coreutils) den
truncate
Befehl an, was dies sehr einfach macht.Ein POSIX-Weg, dies zu tun, ist mit
dd
. Ermitteln Sie zuerst die Dateilänge und kürzen Sie sie dann auf ein Byte weniger.Beachten Sie, dass beide das letzte Byte der Datei unbedingt abschneiden. Vielleicht möchten Sie zuerst überprüfen, ob es sich um eine neue Zeile handelt:
quelle
perl -pi -e 'chomp if eof' myfile
. Im Vergleich zutruncate
oderdd
es wird Sie nicht mit einer kaputten Dateimyfile
zurücklassen, wenn Sie tatsächlich keine nachgestellten Zeilenumbrüche hatten.Sie können das Zeilenumbruchzeichen jedoch wie folgt aus der Zeile entfernen
tr -d '\n'
:Sie können das Zeilenumbruchzeichen am Ende der Datei auf folgende einfache Weise entfernen:
head -c -1 file
Von
man head
:truncate -s -1 file
von
man truncate
:quelle
head -c -1 file | tee file
sicher? Würdetee
die Datei vor dem Start nicht abgeschnitten?tee
die Datei nur geöffnet werden muss, währendhead
der Inhalt gelesen und geschriebentee
werden muss, gewinnt das Rennen in der Praxis mit Ausnahme von manchmal sehr kleinen Dateien.Dies erreichen Sie mit perl als:
Im Vergleich zu
truncate
oderdd
das wird Sie nicht mit einer kaputten Dateimyfile
zurücklassen, wenn Sie tatsächlich keine nachgestellten Zeilenumbrüche hatten.(Die Antwort wird aus dem Kommentar erstellt und basiert auf dieser Antwort. )
quelle
Hier ist eine Möglichkeit : Suchen und ersetzen Sie
sed
in der letzten ($
) Zeile der Datei alles und.*
jeden ( ) durch "was auch immer Sie gefunden haben", gefolgt von "und Linux":Eine noch einfachere Lösung, mit freundlicher Genehmigung von Isaac , ist:
Dies ersetzt das (symbolische) Zeilenende durch den angegebenen Text.
quelle