[Gelöst] Letztes \n eines (html-) Files löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ernohl
Beiträge: 1181
Registriert: 04.07.2002 08:11:56
Wohnort: HL

[Gelöst] Letztes \n eines (html-) Files löschen

Beitrag von ernohl » 18.11.2018 15:35:42

Nach vielen Jahren bin ich dabei, zu den Linux-Basics zurückzukehren - und schon gibt es Probleme. Ich hoffe, mir kann jemand helfen.

Ich habe mir (durch Einlesen und Abspeichern) im vi ein \n am Ende der Datei eingehandelt, was ich nicht mehr los werde. Das File wird jetzt durch WoaS (dazu gleich ein anderer Beitrag) nicht mehr geladen.

So kann ich es nachstellen und meine Reparaturversuche dazu:

Code: Alles auswählen

erno@gauner:/workdir/tmp$ cat /etc/debian_version 
9.6

erno@gauner:/workdir/tmp$ cat testfile
1
22
333
1234
erno@gauner:/workdir/tmp$ tail -1 testfile | od -xc
0000000    3231    3433    000a
          1   2   3   4  \n

erno@gauner:/workdir/tmp$ tail -1 testfile | sed 's/\n//' | od -xc
0000000    3231    3433    000a
          1   2   3   4  \n
Warum matcht \n hier nicht? Weil sed zeilenorientiert arbeitet und deshalb grundsätzlich für mein Problem ungeeignet ist? Diverse Lösungsvorschläge im Netz sehen aber exakt so aus. :?:

Ich habe einen grausamen Workaround gefunden, aber ich wüsste gern, wie es eleganter funktioniert.

Code: Alles auswählen

erno@gauner:/workdir/tmp$ awk '{if (NR==1) {printf $0} else printf "\n%s", $0}' testfile > outfile
erno@gauner:/workdir/tmp$ cat testfile 
1
22
333
1234
erno@gauner:/workdir/tmp$ cat outfile 
1
22
333
1234erno@gauner:/workdir/tmp$ diff testfile outfile 
4c4
< 1234
---
> 1234
\ Kein Zeilenumbruch am Dateiende.
Wäre nett, wenn mir jemand die Augen öffnen könnte. Danke im Voraus.
Zuletzt geändert von ernohl am 18.11.2018 16:12:46, insgesamt 1-mal geändert.
Gruß
ernohl

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Letztes \n eines (html-) Files löschen

Beitrag von Meillo » 18.11.2018 16:01:37

ernohl hat geschrieben: ↑ zum Beitrag ↑
18.11.2018 15:35:42
Warum matcht \n hier nicht? Weil sed zeilenorientiert arbeitet und deshalb grundsätzlich für mein Problem ungeeignet ist?
Korrekt. Sed arbeitet zeilenorientiert. Das Newline am Zeilenende wird fuer die Verarbeitung entfernt, bevor die Regexp angewendet wird.

Dein Problem ist, dass du etwas haben willst, was es in Unix eigentlich nicht gibt. Eine Textdatei besteht aus Zeilen und Zeilen haben ein Newline am Ende. Somit ist in einer Textdatei das letzte Zeichen (per Definition in Unix) immer ein Newline. Aus diesem Grund kannst du keine Text-Tools verwenden um dein Problem zu loesen. (Es ist ja wohl auch entstanden, weil du ein Text-Tool zur Bearbeitung verwendet hast, das automatisch das (aus seiner Sicht) fehlende Newline am Ende ergaenzt hat.)

Du musst also ein Tool verwenden, das nicht auf Zeilen, sondern auf Bytes arbeitet. Ich schlage in diesem Fall folgendes vor:

Code: Alles auswählen

head -c -1
Use ed once in a while!

ernohl
Beiträge: 1181
Registriert: 04.07.2002 08:11:56
Wohnort: HL

[Gelöst]: Letztes \n eines (html-) Files löschen

Beitrag von ernohl » 18.11.2018 16:11:27

Du musst also ein Tool verwenden, das nicht auf Zeilen, sondern auf Bytes arbeitet. Ich schlage in diesem Fall folgendes vor:

Code: Alles auswählen

head -c -1
Das ist beschämend simpel, aber ganau das, worauf ich nicht gekommen bin. Vielen Dank!

Antworten