Zeile anhängen in Textdatei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
geriom
Beiträge: 279
Registriert: 16.10.2004 08:13:37

Zeile anhängen in Textdatei

Beitrag von geriom » 28.10.2005 10:43:19

Hi,
habe folgendes Problem: Ich möchte Textdateien eine neue Zeile anhängen. Jedoch habe ich das Problem, dass manche Dateien ein CR-LF am Ende haben andere nicht. (Dateien kommen aus Windows). Wenn ich nun per cat x >> y die Datei anhänge funktioniert das nur bei den Dateien mit CR-LF am Ende, bei den anderen schreibt er es hinter den letzten Eintrag.
Wie kann ich in einem Script alle Dateien in eine neue Zeile schreiben?

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 28.10.2005 13:05:29

Mein Vorschlag wäre die Dateien mit dos2unix in ein einheitliches Format umzuwandeln.

geriom
Beiträge: 279
Registriert: 16.10.2004 08:13:37

Beitrag von geriom » 28.10.2005 15:17:42

Ich habe es mit recode probiert, jedoch bringt das keine Änderung. Die CR-LF sind zwar Unix konform aber es wird am Ende kein CR eingefügt.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 28.10.2005 17:55:03

hi,

sowas hier funktioniert vielleicht:

Code: Alles auswählen

#!/bin/bash
#
# haengt CR und LF an eine Datei an, wenn sie nicht sowieso schon so endet

# die Groesse der Datei
BYTES=`stat -c%s "$1"`

# (fast) leere Dateien und solche, bei denen stat nicht funktioniert hat,
# werden stillschweigend ignoriert
test $(($BYTES)) -lt 2 && exit

# die letzten beiden Zeichen als Klartext
ENDE="`od -a -A n -j $(($BYTES - 2)) "$1"`"

# wenn die letzten beiden nicht CR und LF sind, werden CR und LF angehaengt.
test "$ENDE" != "  cr  nl" && echo -e "\r" >> "$1"
Beware of programmers who carry screwdrivers.

geriom
Beiträge: 279
Registriert: 16.10.2004 08:13:37

Beitrag von geriom » 31.10.2005 08:37:48

Hallo,
erst mal Danke für den Programmcode. Leider ist es so, das er den richtigen Dateien noch ein CR-LF anhängt aber bei den falschen Zeilen es richtig macht. Somit habe ich in allen richtigen Dateien eine Leerzeile.
Da ich nicht programmieren kann, kannst du mir noch einen Tipp geben?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 31.10.2005 10:47:41

moin, moin,

da hab' ich wohl was nicht verstanden; poste doch bitte mal das Ende jeweils einer
"guten" und einer "schlechten" Datei im Originalzustand. Am besten so:

Code: Alles auswählen

 tail -c5 richtige.daten | od -a -A n
 tail -c5 falsche.daten | od -a -A n
Beware of programmers who carry screwdrivers.

geriom
Beiträge: 279
Registriert: 16.10.2004 08:13:37

Beitrag von geriom » 31.10.2005 12:52:18

Hi,
ich weis zwar nicht was die Zeichen bedeuten, aber hier die Zeilen:

gute Datei: l e n cr nl
schlechte Datei: a y e r n

Ich hoffe dies nützt was.

Benutzeravatar
Mr_Snede
Beiträge: 2323
Registriert: 08.07.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ruhrpott

Beitrag von Mr_Snede » 31.10.2005 13:09:20

geriom hat geschrieben:Hi,
ich weis zwar nicht was die Zeichen bedeuten, aber hier die Zeilen:
Schau dir mal

Code: Alles auswählen

tail --help
und

Code: Alles auswählen

od --help
an. bewirkt, dass die Ergebnisse von tail an od zur weiteren Verarbeitung weitergegeben werden.
Software Finder - Software in Kategorien Debian ohne Ballast - Tipps für ein schlankes Debian

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 31.10.2005 13:15:49

geriom hat geschrieben:Hi,
ich weis zwar nicht was die Zeichen bedeuten, aber hier die Zeilen:

gute Datei: l e n cr nl
schlechte Datei: a y e r n
naja, die bedeuten, dass die gute Datei mit CR-LF aufhört und die schlechte nicht...
In diesem Zusammenhang bedeuten "nl" und "LF" dasselbe.
Ich hoffe dies nützt was.
und ich erst ;)
neuer Versuch:

Code: Alles auswählen

#!/bin/bash
#
# haengt CR und LF an eine Datei an, wenn sie nicht mit LF endet

# die Groesse der Datei
BYTES=`stat -c%s "$1"`

# (fast) leere Dateien und solche, bei denen stat nicht funktioniert hat,
# werden stillschweigend ignoriert
test $(($BYTES)) -lt 2 && exit

# das letzte Zeichen als Klartext
ENDE=`od -a -A n -j $(($BYTES - 1)) "$1"`

# wenn es kein LF ist, werden CR und LF angehaengt.
test $ENDE != "nl" && echo -e "\r" >> "$1"
Beware of programmers who carry screwdrivers.

geriom
Beiträge: 279
Registriert: 16.10.2004 08:13:37

Beitrag von geriom » 31.10.2005 15:39:38

Hallo,
vielen Dank Cosmac. Das war die Lösung.
Dankeeeeeeeeeeeeeeeeeeeeeeeeee.

Antworten