View previous topic :: View next topic |
Author |
Message |
passst n00b
Joined: 25 Apr 2016 Posts: 3
|
Posted: Mon Apr 25, 2016 10:29 am Post subject: Text mit sed vorformatieren |
|
|
Hallo,
ich muss zwei unterschiedliche Versionen von einer Übersetzung vergleichen. Als Idee hatte ich die Texte nebeneinander in Tabellenkalkulation zu importieren. Der Punkt sollte als Trennzeichen fungieren. D.h. jede Zelle enthält genau einen Satz. Das klappt leider nicht, weil Tabulatoren und sonstige "unsichtbare" Sonderzeichen die Formatierung durcheinanderbringen. Ich habe dann versucht die Texte mit sed vorzuformatieren, so daß alle Zeilen der Textdateien mit einem Punkt enden.
Zeilen zusammenfügen, unsichtbare Zeichen etc geht mit sed wunderbar, aber wie füge ich zwei oder mehrere Zeilen bis zu einem bestimmten Satzzeichen, wie z.B. der Punkt zusammen?
Es soll also,
aaa
bbb.bbbb
ccc.
so aussehen:
aaabbb.
bbbccc.
Ich bin einfach nicht dahintergekommen. Geht das überhaupt mit sed? Oder hat jemand eine bessere Idee? |
|
Back to top |
|
|
py-ro Veteran
Joined: 24 Sep 2002 Posts: 1734 Location: Velbert
|
Posted: Mon Apr 25, 2016 10:56 am Post subject: |
|
|
Warum benutzt du nicht eines von den vorhandenen Diff Programmen? |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3922 Location: Hamburg
|
Posted: Mon Apr 25, 2016 5:38 pm Post subject: |
|
|
sed heißt (s)tream-line (ed)itor - das Design ist also, zeilenweise zu agieren. Da hast Du keine Chance mit diesem Use-Case, fürchte ich. |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Tue Apr 26, 2016 7:33 am Post subject: |
|
|
toralf wrote: | sed heißt (s)tream-line (ed)itor - das Design ist also, zeilenweise zu agieren. |
Ja, aber es gibt einen Zeilenspeicher und einen Befehl, den aktuellen Zeileninhalt an den Zeilenspeicher anzuhängen. Dann kann man diesen zurückholen und mit s/../../ splitten. Ich bin aber nicht genug sed-Guru, um den entsprechenden Code ohne längere Recherche hinzuschreiben. Ich würde das Problem mit perl lösen (oder zur Not mit awk, falls es aus irgendeinem Grund auf einem System ohne Perl laufen muss) |
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Wed Apr 27, 2016 10:18 pm Post subject: |
|
|
Im Zweifelsfall würde ich für sowas Perl nehmen. Perl ist immer gut für solche schmutzigen Angelegenheiten ;-)
Hier ist dein Ausgangs-String:
Code: | $ echo -e "aaa\nbbb.bbb\nccc."
aaa
bbb.bbb
ccc. |
Und hiermit macht Perl das, was du willst:
Code: | $ echo -e "aaa\nbbb.bbb\nccc." | perl -ne "chomp; s/\./.\n/g; print;"
aaabbb.
bbbccc. |
Natürlich auch nutzbar mittels
Code: | cat datei | perl -ne "chomp; s/\./.\n/g; print;" |
|
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3922 Location: Hamburg
|
Posted: Thu Apr 28, 2016 8:10 am Post subject: |
|
|
+1
Perl rules. |
|
Back to top |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Fri Apr 29, 2016 2:10 pm Post subject: Re: Text mit sed vorformatieren |
|
|
passst wrote: |
Es soll also,
aaa
bbb.bbbb
ccc.
so aussehen:
aaabbb.
bbbccc. |
Bitte sehr:
Code: | sed ':a;N;$!ba;s/\n//g;s/\./.\n/g' deine_datei.txt |
|
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Sun May 01, 2016 10:28 am Post subject: |
|
|
Na toll. Auch noch zwei Zeichen kürzer als meine Perl-Lösung! Aber die Leerzeichen könnt man ja weglassen ;-)
Aber Spaß beiseite: Aus rein wissenschaftlichem Interesse wäre es super, wenn du den sed-Befehl mal auseinanderpflücken und erklären würdest, was da was macht! |
|
Back to top |
|
|
Markus09 Tux's lil' helper
Joined: 22 Mar 2013 Posts: 78
|
Posted: Sun May 01, 2016 12:16 pm Post subject: |
|
|
Code: | sed ':a;N;$!ba;s/\n//g;s/\./.\n/g' deine_datei.txt |
Da es mich interessiert hat, habe ich das mit der Doku mal zerpflückt.
Der Befehl mach also sowas:
Teil 1: :a;N;$!ba;
Lese alle Zeilen in den "Lesepuffer"
1) Vergebe das Label "a" (:a)
2) lese und hänge die nächste Zeile dem aktuelle Lesepuffer an (N)
3) Warte auf Ende der Datei ($)
4) Falls nicht, gehe wieder zu 1), wo was label "a" definiert wurde (!ba)
--> Damit sind alle Zeilen im Lesepuffer
Teil 2: s/\n//g
Entferne alle newlines
Teil 3: s/\./.\n/g
Füge nach allen Punkten ein newline ein |
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Sun May 01, 2016 9:38 pm Post subject: |
|
|
Abgefahren. Ich wusste gar nicht, dass sed sowas kann … |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Mon May 02, 2016 5:15 am Post subject: |
|
|
l3u wrote: | Abgefahren. Ich wusste gar nicht, dass sed sowas kann … |
sed ist vermutlich sogar Turing-vollständig (von der theoretischen Einschränkung der Stringlänge durch die Implementierung einmal abgesehen, natürlich). Es gibt sogar verschiedene Spiele, die in sed programmiert sind: Tetris, Türme von Hanoi, ... die einzige Einschränkung bei der Interaktivität ist natürlich, dass man nach jeder Eingabe "return" drücken muss. |
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Mon May 02, 2016 11:21 am Post subject: |
|
|
mv wrote: | Es gibt sogar verschiedene Spiele, die in sed programmiert sind: Tetris |
:-D
Das sed-Tetris erinnert mich allerdings stark an Brainfuck ;-) |
|
Back to top |
|
|
|