GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich einen Zeilenumbruch löschen, wenn es das letzte Zeichen in einer Datei ist?

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äßigen echo -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 .


Linux
  1. Wie kann ich eine Datei unter Linux symbolisch verknüpfen?

  2. Wie kann ich das Argument des vorherigen Bash-Befehls abrufen?

  3. So verwenden Sie sed, um die letzten n Zeilen einer Datei zu entfernen

  4. tr Befehl - wie man die Zeichenfolge \n durch einen tatsächlichen Zeilenumbruch (\n) ersetzt

  5. Wie kann ich dem Anfang jeder Zeile in einer Datei eine Zeichenfolge voranstellen?

Wie füge ich am Ende einer Datei einen Zeilenumbruch hinzu?

Wie kann ich die Berechtigungen meiner Dateien korrigieren?

Wie kann ich zwei Abschnitte derselben Datei unterscheiden?

Wie kann ich sicherstellen, dass mein System die Datei ~/.screenrc verwendet?

Wie kann ich die Länge einer Videodatei von der Konsole abrufen?

Wie finde ich die älteste Datei in einem Verzeichnisbaum?