perl -pe 'chomp if eof' filename >filename2
oder, um die Datei an Ort und Stelle zu bearbeiten:
perl -pi -e 'chomp if eof' filename
Dies wurde auf der awk-Website, die ich gesehen habe, als „Perl-Blasphemie“ beschrieben.
Aber in einem Test hat es funktioniert.
Sie können sich die Tatsache zunutze machen, dass Shell-Befehlsersetzungen nachgestellte Zeilenumbrüche entfernen :
Einfache Form, die in bash, ksh, zsh funktioniert:
printf %s "$(< in.txt)" > out.txt
Portable (POSIX-konforme) Alternative (etwas weniger effizient):
printf %s "$(cat in.txt)" > out.txt
Hinweis:
- Wenn
in.txt
endet mit mehreren Zeilenumbruchzeichen entfernt die Befehlsersetzung alle von ihnen . (Es entfernt keine anderen Leerzeichen als abschließende Zeilenumbrüche.) - Da dieser Ansatz die gesamte Eingabedatei in den Speicher liest , es empfiehlt sich nur für kleinere Dateien.
printf %s
stellt sicher, dass kein Zeilenumbruch an die Ausgabe angehängt wird (es ist die POSIX-konforme Alternative zum nicht standardmäßigenecho -n
; siehe http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html und https://unix.stackexchange.com/a/65819)
Ein Leitfaden für die anderen Antworten :
-
Wenn Perl verfügbar ist, wählen Sie die akzeptierte Antwort - es ist einfach und speichereffizient (liest nicht die gesamte Eingabedatei auf einmal).
-
Betrachten Sie andernfalls Awk von ghostdog74 Antwort - es ist obskur, aber auch speichereffizient; ein besser lesbares Äquivalent (POSIX-kompatibel) ist:
-
awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt
-
Der Druck wird um eine Zeile verzögert, damit die letzte Zeile im
END
behandelt werden kann Block, wo es ohne abschließendes\n
gedruckt wird aufgrund der Einstellung des Output-Record Separators (OFS
) in eine leere Zeichenfolge. -
Wenn Sie eine ausführliche, aber schnelle und robuste Lösung suchen, die wirklich direkt vor Ort bearbeitet (im Gegensatz zum Erstellen einer temporären Datei, die dann das Original ersetzt), ziehen Sie das Perl-Skript von jrockway in Betracht .