skript mit sed

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

skript mit sed

Beitrag von Robertba » 31.01.2010 18:01:43

Hallo,

ich hatte mich vor einem halben Jahr mal in den Befehl "sed" eingearbeitet und mir mit dessen Hilfe ein kleines Skript zum umformatieren von Dateien gebastelt.
Jetzt bräuchte ich wieder so ein kleines skript, aber ich kanns nicht mehr :(

Könnt ihr mir vielleicht kurz helfen? Das Problem ist folgendes:

ich habe eine Textdatei, in der manche Zeilen mit einem Leerzeichen anfangen. Diese Zeilen, die mit einem Leerzeichen beginnen, sollen ohne das Leerzeichen an die Zeile oben drüber angehängt werden. Also so:

Vorher

Code: Alles auswählen

Blabla
testtest
dumdidum
_jaja
soistdas
(der Unterstrich ist ein Leerzeichen)

nachher

Code: Alles auswählen

Blabla
testtest
dumdidumjaja
soistdas
Das ist bestimmt nicht schwer, ich schätze so 1-2 Zeilen code, aber ich bekomme es nicht mehr hin :(

Gruß Robert

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: skript mit sed

Beitrag von SubOptimal » 31.01.2010 21:21:48

Hi,

so geht's

Code: Alles auswählen

sed -e 'N;s/\n //' foobar.in
Jede Zeile, die mit einem Leerzeichen beginnt, wird an die vorherige angehängt und das Leerzeichen entfernt.

SubOptimal

Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

Re: skript mit sed

Beitrag von Robertba » 01.02.2010 10:18:13

Vielen Dank, auf so eine elegante Lösung hatte ich gehofft. Leider klappt es nicht so richtig.
Mit den 5 Testzeilen klappt es wunderbar, aber mit der richtigen Datei kommt nichts brauchbares raus. Ich habe keine Ahnung, warum das nicht auch klappt.
Hier ist ein Stück der Datei, die nicht funktioniert. Wenn ich das skript damit teste, kommt nicht das gewünschte Ergebnis dabei heraus:

Code: Alles auswählen

BEGIN:VTIMEZONE
TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Berlin
X-LIC-LOCATION:Europe/Berlin
BEGIN:STANDARD
TZNAME:CET
DTSTART:19701031T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:CEST
DTSTART:19700328T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
TZOFFSETFROM:+0100
BEGIN:VEVENT
UID:20100130T202032Z-2802-1000-1-1@dell
DTSTAMP:20100130T202032Z
DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin:
_20100208T000000
DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin:
_20100208T233000
TRANSP:TRANSPARENT
SEQUENCE:2
SUMMARY:Bella Geburtstag
DESCRIPTION:Bella hat Geburtstag
DTSTAMP:20100130T202242Z
DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin:
_20100219T190000
DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin:
_20100219T213000
TRANSP:OPAQUE
SEQUENCE:2
Wo liegt denn da das Problem?

Gruß Robert

ps: ich habe die Leerzeichen wieder durch Unterstriche ersetzt, da man sie sonst nicht sieht. Zum Testen einfach die Unterstriche wieder durch Leerzeichen ersetzen. (es sind insgesamt 4 Stück)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: skript mit sed

Beitrag von ThorstenS » 01.02.2010 10:33:28

Code: Alles auswählen

< DATEI sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'

Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

Re: skript mit sed

Beitrag von Robertba » 01.02.2010 11:05:28

vielen Dank, aber irgendwie klappt das auch nicht so, wie ich es mir vorstelle: die letzten vier Zeilen sehen in der Konsole so aus:

Code: Alles auswählen

DTSTAMP:20100130T202242Z
 20100219T190000eeassociation.sourceforge.net/Tzfile/Europe/Berlin:
 20100219T213000association.sourceforge.net/Tzfile/Europe/Berlin:
TRANSP:OPAQUE
Er hängt die Zeilen also irgendwie samt leerzeichen an den Anfang der oberen Zeile und überschreibt dabei den Anfang. Noch merkwürdiger ist aber, dass, wenn ich die Ausgabe mit "> test" in eine Datei umleite, überhaupt keine Änderungen vorgenommen werden. In der Ausgabe-datei ist dann alles genau so, wie in der Eingabe-datei.

Das ist doch zum Haare-raufen :(

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

Re: skript mit sed

Beitrag von Meillo » 01.02.2010 11:09:42

Mit awk geht's bespielsweise so:

Code: Alles auswählen

<INPUT awk '!/^_/ && NR>1 { print "" } { sub(/^_/,""); printf $0 }'
Use ed once in a while!

Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

Re: skript mit sed

Beitrag von Robertba » 01.02.2010 11:29:30

so langsam fange ich an, an mir zu zweifeln...

Die awk Variante ändert bei mir überhaupt nichts an der Input-Datei... die wird einfach unverändert wieder ausgegeben...
Ich kann mir nicht vorstellen, dass hier 4 Lösungen präsentiert werden, die alle nicht funktionieren. Aber ich wüsste auch nicht, was ich beim kopieren falsch machen sollte. Ich kopiere euren code, ersetze den Input durch den richtigen Dateiname und lass es laufen. Das darf ja wohl nicht wahr sein :)

verunsicherte Grüße
Robert

ps:
ich hab eben per pn noch folgende Variante angeboten bekommen:

Code: Alles auswählen

<DATEI sed ':X;N;s|\n_||g;bX'
aber auch die funktioniert nicht. Es ändert sich nichts.
Ich habe den Beispielstext, den ich oben gepostet habe, nochmal hier aus dem Forum rauskopiert und in eine neue Datei eingefügt, um ausschließen zu können, dass meine Original-datei am Ende kein Leerzeichen, sondern irgend ein unsichtbares Sonderzeichen am Zeilenanfang enthält, aber auch das brachte keine Änderung. Es ist verhext :(

Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

Re: skript mit sed

Beitrag von Robertba » 01.02.2010 11:44:21

So, keine halben Sachen mehr:


http://www.file-upload.net/download-221 ... ar.gz.html

hier ist ein paket in der die original-datei, sowie ein skript ist, in dem ich die letzte Variante ausführen lasse. Kann das mal jemand bei sich ausprobieren, ob das klappt? Wenn es bei euch damit klappt, liegt der Fehler bei mir. Wenn es bei euch auch nicht funktioniert, dann kann man weiter den Fehler suchen.

Danke im Vorraus.

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

Re: skript mit sed

Beitrag von Meillo » 01.02.2010 11:47:35

Robertba hat geschrieben:Die awk Variante ändert bei mir überhaupt nichts an der Input-Datei... die wird einfach unverändert wieder ausgegeben...
Ich habe deine Beispieltexte kopiert und getestet -- erfolgreich.


Welche Version von sed und awk hast du? Was für ein System hast du? Was sagt file zu den Dateien? Wie sieht dein Locale aus?
Use ed once in a while!

yeti

Re: skript mit sed

Beitrag von yeti » 01.02.2010 12:03:32

DOSische CR-LF-Zeilenendung scheint mir der "Pöchewicht" zu sein:

Code: Alles auswählen

cat calendar.ics | sed ':X;N;s:\r\n ::g;bX'

Robertba
Beiträge: 134
Registriert: 22.06.2008 11:19:51

Re: skript mit sed

Beitrag von Robertba » 01.02.2010 12:08:31

yeti hat geschrieben:DOSische CR-LF-Zeilenendung scheint mir der "Pöchewicht" zu sein:

Code: Alles auswählen

cat calendar.ics | sed ':X;N;s:\r\n ::g;bX'
Ha!
100 Punkte, es klappt!!!

Danke an euch alle, jetzt habe ich so viele skripts zur Auswahl, die jetzt auf einmal alle funktionieren :)
jetzt bräuchte ich eigentlich gleich das nächste Skript, das dafür sorgt, dass alle von euch vorgeschlagenen Varianten abwechselnd ausgeführt werden, der Gerechtigkeit wegen :D

Aber nochmal im Ernst: Ich muss erstmal kurz testen, ob nicht am Ende gar die DOSische Zeilenendung voraussetzung dafür ist, dass die .ics Datei benutzbar bleibt. Ich editier gleich das Ergebnis hier her :)

€dit: Alles funktioniert, das Skript ist damit einsatzbereit! 10000 Dank an euch alle! Und ein Bonus-Dank an Yeti :)

Antworten