Zeilenumbrüche in Textdateien bearbeiten
Hallo Listige, folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76). Ich wollte jetzt ein kleines Utility mit folgender Funktionalität basteln: Kopiere eine Textdatei "Ein.txt" in eine andere Textdatei "Aus.txt". Dabei folgende Ersetzungen der Zeilenvorschuebe [cr] vornehmen: a) Umbrüche raus: text1[cr]text2 -> text1[leerzeichen]text2 b) Silbentrennungen: text1-[cr]text2 -> texttext (Ausnahme: text2 ist groß geschrieben! Dann Bindestrich!?) c) Satz+Absatzende erkennen: text1[./!/?][cr] -> [cr] erhalten d) Unnötige Leerzeilen löschen: n[cr] -> [cr] Ich hoffe ich habe jetzt nichts Wesentliches vergessen... Das Teil soll also möglichst automatisch die einzelnen Zeilen eines Absatzes zusammenfügen. Frage: gibt es ein fertiges Programm, das diese Arbeit für mich erledigen kann? Ggf. mit einer für diesen Zweck zu erstellenden Konfigurationsdatei. Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-Hoehne@t-online.de / _____________________________________/
Michael Hoehne wrote:
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76).
Ich wollte jetzt ein kleines Utility mit folgender Funktionalität basteln:
Kopiere eine Textdatei "Ein.txt" in eine andere Textdatei "Aus.txt". Dabei folgende Ersetzungen der Zeilenvorschuebe [cr] vornehmen:
a) Umbrüche raus: text1[cr]text2 -> text1[leerzeichen]text2 b) Silbentrennungen: text1-[cr]text2 -> texttext (Ausnahme: text2 ist groß geschrieben! Dann Bindestrich!?) c) Satz+Absatzende erkennen: text1[./!/?][cr] -> [cr] erhalten d) Unnötige Leerzeilen löschen: n[cr] -> [cr]
Ich hoffe ich habe jetzt nichts Wesentliches vergessen... Das Teil soll also möglichst automatisch die einzelnen Zeilen eines Absatzes zusammenfügen.
Frage: gibt es ein fertiges Programm, das diese Arbeit für mich erledigen kann? Ggf. mit einer für diesen Zweck zu erstellenden Konfigurationsdatei.
Bis jetzt hat noch keiner geantwortet, ich fang mal "klein" an... Sowas geht imho am elegantesten mit "Regulären Ausdrücken" (RA). Das sind sehr einfach gesagt Suchmaster, mit denen man sehr elegant und gezielt solche Probleme lösen kann. Man kann sowas dann z.B. in Perl realisieren oder auch mit dem Kommando "sed". Das sollte in ein paar Zeilen Code zu machen sein, aber die habens in sich! Also wenn hier keiner mehr postet, dann versuchs mal in einer allgemeinen UNIX-group oder in einer Perl-group. Bitte schick mir auf alle Fälle das Ergebnis, solche Dinger (RA) sind höchst interessant aber leider mit ein Grund, warum für viele Perl als cryptische, d.h. schwer verständliche Sprache gilt. Gruss Franz
Hallo! Vielleicht hilft Dir ja auch schon die Option Extras-> Zeilen zusammenführen im KDE-Editor Kate? Hat mir jedenfalls schon oft geholfen beim Rückgängigmachen von Zeilenumbrüchen.
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76).
Ich wollte jetzt ein kleines Utility mit folgender Funktionalität basteln:
Kopiere eine Textdatei "Ein.txt" in eine andere Textdatei "Aus.txt". Dabei folgende Ersetzungen der Zeilenvorschuebe [cr] vornehmen:
a) Umbrüche raus: text1[cr]text2 -> text1[leerzeichen]text2 b) Silbentrennungen: text1-[cr]text2 -> texttext (Ausnahme: text2 ist groß geschrieben! Dann Bindestrich!?) c) Satz+Absatzende erkennen: text1[./!/?][cr] -> [cr] erhalten d) Unnötige Leerzeilen löschen: n[cr] -> [cr]
Ich hoffe ich habe jetzt nichts Wesentliches vergessen... Das Teil soll also möglichst automatisch die einzelnen Zeilen eines Absatzes zusammenfügen.
Frage: gibt es ein fertiges Programm, das diese Arbeit für mich erledigen kann? Ggf. mit einer für diesen Zweck zu erstellenden Konfigurationsdatei.
Am Mittwoch, 26. Mai 2004 12:42 schrieb Templado:
Hallo! Vielleicht hilft Dir ja auch schon die Option Extras-> Zeilen zusammenführen im KDE-Editor Kate? Hat mir jedenfalls schon oft geholfen beim Rückgängigmachen von Zeilenumbrüchen.
1. Du hast schon gelesen, dass es sich um 200 Seiten handelt? 2. Bitte sieh mal nach bei http://learn.to/quote/ wie man richtig 'quotet'.
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76). [...]
Gruss, Andreas.
Am Mittwoch, 26. Mai 2004 13:37 schrieb Andreas Scherer:
Am Mittwoch, 26. Mai 2004 12:42 schrieb Templado:
Hallo! Vielleicht hilft Dir ja auch schon die Option Extras-> Zeilen zusammenführen im KDE-Editor Kate? Hat mir jedenfalls schon oft geholfen beim Rückgängigmachen von Zeilenumbrüchen.
1. Du hast schon gelesen, dass es sich um 200 Seiten handelt?
2. Bitte sieh mal nach bei http://learn.to/quote/ wie man richtig 'quotet'.
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76).
[...]
Gruss, Andreas.
hallo an alle! ich habe eine vorabversion bereits an michael geschickt, da hier das Interesse doch größer wurde poste ich den hauptteil eines Lösungsskripts, wer das vollständige, auskommentierte skript möchte soll mir mailen! gruss d ----- skriptvorschlag ---- #!/usr/bin/perl use Getopt::Std; our($opt_t, $opt_i, $opt_o, $opt_f); use strict; my ( $usage, $satzenden, $infile, $outfile, $c1, $c2, $line, $nextline ); $satzenden = ".!?"; getopt('tio'); def_usage(); $/ = "\r\n" if ( $opt_t =~ /dos/ ); $/ = "\r" if ( $opt_t =~ /mac/ ); $infile = $opt_i; die "$infile gibt es nicht!\n" if not (-e $infile); if ($opt_o) { $outfile = $opt_o; } else { $outfile = "$infile.weg"; print "Ausgabe in $outfile\n\n"; } die "$outfile existiert, bitte -o ändern oder -f angeben" if ( -e $outfile and not $opt_f ); open(IN, "< $infile" ) or die "Kann $infile nicht lesen!: $!\n"; open(OUT, "> $outfile" ) or die "Kann $outfile nicht schreiben!: $!\n"; while ( $line = <IN> ) { $c1++; chomp $line; next if not $line; if ( $line =~ /[$satzenden]$/m ) { $line .= $/; } elsif ( $line =~ /-$/ ) { $nextline = <IN>; if ($nextline =~ /^[a-z]/m) { $line =~ s/-$//; $line .= $nextline; } elsif ($nextline =~ /^[A-Z]/m) { $line .= $nextline; } else { $line .= " " . $nextline } redo } else { $line .= " "; } print OUT $line; $c2++; } print "************ ", 35 x "*", "** ************* ** ", 35 x "*", "\n" ; printf "Eingabedatei %-35s ** Ausgabedatei ** %-35s\n", $infile, $outfile; printf "Eingabezeilen %-35s ** Ausgabezeilen ** %-35s\n\n", $c1, $c2; # da der Hilfetext im Ablauf gestört hat # definiere ich ihn hier!! sub def_usage { $usage = <<"_END_"; $0 -t dos|unix|mac -i infile.txt [ -o outfile.txt -f ] Das perlskript verwandelt kurz umgebrochene Textfiles in Files, die (hoffentlich) nur noch nach Satzendezeichen Zeilenumbrüche enthalten. Da das Skript nicht auf den Dateityp (dos|unix|mac) prüft MUSS er mit -t angegeben werden!! -t dos # Zeilenende <cr><lf> -t unix # Zeilenende <lf> -t mac # Zeilenende <cr> -i infile # Muss-Angabe -o outfile # wie soll das Kindchen heissen? # ohne Angabe output in infile.weg -f force # überschreibt ein bestehendes outfile _END_ die "$usage" if (not $opt_i); die "$usage" if (not $opt_t); }
Am Mittwoch, 26. Mai 2004 12:20 schrieb Franz:
Michael Hoehne wrote:
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76).
Ich wollte jetzt ein kleines Utility mit folgender Funktionalität basteln: ...
Bis jetzt hat noch keiner geantwortet, ich fang mal "klein" an...
Stimmt nicht ganz. Ich habe eine private Mail von Dominik Schopper bekommen. Dabei als Anlage ein Perl-Skript, das -soweit ich das jetzt überblicke- an meine Erfordernisse anpassbar ist.
Sowas geht imho am elegantesten mit "Regulären Ausdrücken" (RA). Das sind sehr einfach gesagt Suchmaster, mit denen man sehr elegant und gezielt solche Probleme lösen kann.
In rudimentärer Weise habe ich solche Sachen mit einer Textverarbeitungsbibliothek unter VMS und privat mit Editor +(A)REXX-Steuerung auf meinem guten alten Amiga-OS gemacht.
Das sollte in ein paar Zeilen Code zu machen sein, aber die habens in sich!
Da ich ständig andere Rechner zu betreuen hatte, mußte ich mich oft umgewöhnen, deshalb habe zuletzt kleine portable C-Progrämmchen gebastelt. Die waren dann in der Art der Net-PBM-Tools zu gebrauchen: Text > Programm1|Programm2|Programm3|... > Text Ich wollte mich aber mal wieder etwas weiter bilden. Perl scheint mir auch für die anderen kleinen Projekte ganz vielversprechend...
Also wenn hier keiner mehr postet, dann versuchs mal in einer allgemeinen UNIX-group oder in einer Perl-group. Bitte schick mir auf alle Fälle das Ergebnis, solche Dinger (RA) sind höchst interessant aber leider mit ein Grund, warum für viele Perl als cryptische, d.h. schwer verständliche Sprache gilt.
Ich schreibe dir gern, was dabei rausgekommen ist. Am Wochenende habe ich tatsächlich mal wieder einen freien Tag, den werde ich nutzen. Gruss, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-Hoehne@t-online.de / _____________________________________/
Michael Hoehne wrote:
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76).
Ich wollte jetzt ein kleines Utility mit folgender Funktionalität basteln:
also für alle Deine Probleme mit diesem Dokument sollte in der Tat sed das richtige Tool sein. Allerdings mußt Du aufpassen, in welcher Reihenfolge Du die Schritte ausführst. Wenn Du Schritt a einzelen zuerst ausführts, dann kannst Du Dir die restlichen Schritte sparen ;-). Also zuerst die komplizierten Sachen ersetzten (wenige Treffer, z.B. c oder b) und dann die weniger komplizierten (mehr Treffer a)
Kopiere eine Textdatei "Ein.txt" in eine andere Textdatei "Aus.txt". Dabei folgende Ersetzungen der Zeilenvorschuebe [cr] vornehmen:
a) Umbrüche raus: text1[cr]text2 -> text1[leerzeichen]text
Die Erkennung der Zeilenumbrüche könnte schwieriger werden. Ist die Textdatei im DOS oder Unix-Format?
b) Silbentrennungen: text1-[cr]text2 -> texttext (Ausnahme: text2 ist groß geschrieben! Dann Bindestrich!?) c) Satz+Absatzende erkennen: text1[./!/?][cr] -> [cr] erhalten d) Unnötige Leerzeilen löschen: n[cr] -> [cr]
Ich hoffe ich habe jetzt nichts Wesentliches vergessen... Das Teil soll also möglichst automatisch die einzelnen Zeilen eines Absatzes zusammenfügen.
Frage: gibt es ein fertiges Programm, das diese Arbeit für mich erledigen kann? Ggf. mit einer für diesen Zweck zu erstellenden Konfigurationsdatei.
wenn Du noch konkretere Hilfe brauchst, dann schick mir vielleicht einfach mal eine Seite der Datei und ich versuche Dir ein sed/awk-Script zu schreiben welches das Dokument nach Deinen Vorgaben zusammenfügt.
Gruß, Michael
viele Grüße Falko
Am Mittwoch, 26. Mai 2004 16:00 schrieb Falko Zurell:
Michael Hoehne wrote:
Hallo Listige,
folgendes Problem: Ein Kollege hat ein ca. 200-seitiges Manual verbrochen und das orginale Worddokument gekillt. Die einzige Version, die noch vorliegt, ist eine einfachte Textdatei, die jedoch komplett umgebrochen ist (maximale Zeilenbreite ist 76). ...
also für alle Deine Probleme mit diesem Dokument sollte in der Tat sed das richtige Tool sein. Allerdings mußt Du aufpassen, in welcher Reihenfolge Du die Schritte ausführst. Wenn Du Schritt a einzelen zuerst ausführts, dann kannst Du Dir die restlichen Schritte sparen ;-). Also zuerst die komplizierten Sachen ersetzten (wenige Treffer, z.B. c oder b) und dann die weniger komplizierten (mehr Treffer a) ...[genauere Anleitung]
Ich werde mich mal an Dominiks perl-skripte setzen. Trotzdem schaue ich mir sed auch mal näher an. Das erinnert mich (zumindest in Grundzügen) an die feine kleine Textbearbeitungsbibliothek, die ich unter VAX/VMS zur Verfügung hatte.
wenn Du noch konkretere Hilfe brauchst, dann schick mir vielleicht einfach mal eine Seite der Datei und ich versuche Dir ein sed/awk-Script zu schreiben welches das Dokument nach Deinen Vorgaben zusammenfügt.
Falls meine eigenen Bemühungen scheitern, dann wirst du das Angebot verfluchen ;-))) Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-Hoehne@t-online.de / _____________________________________/
participants (6)
-
Andreas Scherer
-
Dominik Schopper
-
Falko Zurell
-
Franz
-
Michael Hoehne
-
Templado