Discussion:
RegEx für Zeilenumbruch?
(zu alt für eine Antwort)
Nikolai Försterling
2006-05-25 14:41:52 UTC
Permalink
Erstmal sorry für den xpost, passt m.E. in beide Gruppen.

Ich habehier eine textdatei, die ich mangels ausreichender Erfahrung mit
Regular Expressions mit kwrite bzw. dem RexEx-Editor (schande über
mich) bearbeite.

In dieser Datei möchte ich eigentlich nur ein Zeichen (%) und den darauf
folgenden Zeilenumbruch löschen/ersetzen, um die Zeilen anschließend
alphabetisch zu sortieren und den Umbruch nebst % wieder einzufügen.
(Wegen Übersicht und Doublettenvermeidung)
__________________________________________________________
%
Bringen Sie die Lösung, oder sind Sie selbst das Problem?
%
Nihil est annis velocius (Ovid)
%
Talente finden Lösungen, Genies entdecken Probleme. (Krailsheimer)
___________________________________________________________

[%][\r\n] funktioniert aber leider nicht.

Ich würde das ja auch mit sed probieren, ab da ist mir die Syntax noch
zu kompliziert und prinzipiell geht es ja auch nur um die RegEx.

Kann mir bitte mal jemand auf die Sprünge helfen?
--
lg Niko
________________________________
Wer nicht daran glaubt, besser zu werden, hört auf gut zu sein.
J. Seyfferth
2006-05-25 15:57:07 UTC
Permalink
Post by Nikolai Försterling
Ich habehier eine textdatei, die ich mangels ausreichender Erfahrung mit
Regular Expressions mit kwrite bzw. dem RexEx-Editor (schande über
mich) bearbeite.
In dieser Datei möchte ich eigentlich nur ein Zeichen (%) und den darauf
folgenden Zeilenumbruch löschen/ersetzen, um die Zeilen anschließend
alphabetisch zu sortieren und den Umbruch nebst % wieder einzufügen.
(Wegen Übersicht und Doublettenvermeidung)
grep -v ^% datei.txt | sort | sed "s/^/%\n/"

Wobei meiner Meinung Dein Beispiel bereits sortiert ist.
Post by Nikolai Försterling
__________________________________________________________
%
Bringen Sie die Lösung, oder sind Sie selbst das Problem?
%
Nihil est annis velocius (Ovid)
%
Talente finden Lösungen, Genies entdecken Probleme. (Krailsheimer)
___________________________________________________________
[%][\r\n] funktioniert aber leider nicht.
Ich würde das ja auch mit sed probieren, ab da ist mir die Syntax noch
zu kompliziert und prinzipiell geht es ja auch nur um die RegEx.
Kann mir bitte mal jemand auf die Sprünge helfen?
--
Mit freundlichen Gruessen
J. Seyfferth

Aktionsseite des Pro Trinitron e.V.
http://www.forwiss.uni-passau.de/~berberic/trinitron.html
Nikolai Försterling
2006-05-26 11:40:46 UTC
Permalink
Post by J. Seyfferth
grep -v ^% datei.txt | sort | sed "s/^/%\n/"
Sehr schön, danke ;-)
Das hatte ich mir schlimmer vorgestellt...
Post by J. Seyfferth
Wobei meiner Meinung Dein Beispiel bereits sortiert ist.
Klar, darauf hatte ich im Beispiel gar nicht geachtet.
Post by J. Seyfferth
Post by Nikolai Försterling
[%][\r\n] funktioniert aber leider nicht.
Die Aufgabe ist ja (fast) gelöst, aber mich interessiert trotzdem noch,
wo ich bei der RegEx einen Fehler mache.

Ich möchte nicht dumm sterben ;-)
--
lg Niko
________________________________
Du hast bei den besten Sache schon halb verloren, wenn du nicht
kaltblütig bleibst.
J. Seyfferth
2006-05-26 22:58:19 UTC
Permalink
Post by Nikolai Försterling
Post by J. Seyfferth
grep -v ^% datei.txt | sort | sed "s/^/%\n/"
Sehr schön, danke ;-)
Das hatte ich mir schlimmer vorgestellt...
Post by J. Seyfferth
[...]
[...]
Post by J. Seyfferth
Post by Nikolai Försterling
[%][\r\n] funktioniert aber leider nicht.
Die Aufgabe ist ja (fast) gelöst, aber mich interessiert trotzdem noch,
wo ich bei der RegEx einen Fehler mache.
Dein RegEx passt schon, nur kommen an ihm nicht die Zeichen vorbei die
Du erwartest und somit passiert nichts.



Vielleicht kann ich es am Beispiel von sed erklaeren.

sed betrachtet normalerweise nur eine Zeile nach der anderen und da auch
nur den Inhalt.
D.h. das Zeichen fuer den Zeilenumbruch bekommst du bei sed
normalerweise nicht zu fassen, weil dies nicht in den "pattern space"
eingelesen wird, auf den sich die ueblichen Suchen- und Ersetzenaktionen
beziehen.

D.h. eine Variante wie

sed "s/[%][\r\n]//" datei.txt

funktioniert nicht.


ABER, wenn Du sed anweist die aktuelle Zeile UND die naechste in den
"pattern space" einzulesen, DANN findet sich im "pattern space" auch das
Zeichen fuer den Zeilenumbruch zw. den beiden Zeilen und danach kann man
dann wieder greifen und agieren.

Also funktioniert folgendes:

sed "/%/{N;s/%[\r\n]//}" datei.txt


Kurze Erklaerung: /%/ sucht nach dem Zeichen % in der aktuellen Zeile
und nur wenn es gefunden wird, dann wird der Teil in der geschweiften
Klammer abgearbeitet. Das "N" heißt nimm noch die naechste Zeile und
haenge sie an die vorige an. D.h. der folgende Suchen- u. Ersetzenbefehl
(s///) bekommt jetzt das %-Zeichen, das Zeichen fuer den Zeilenumbruch
und die naechste Zeile zu sehen und kann damit arbeiten.



Uebrigens, eine eckicke Klammer um ein einzelnes Zeichen, (hier %),
kannst Du auch weglassen. Eine eckicke Klammer ist nur dann wichtig wenn
Alternativen moeglich sein sollen, wie \r oder \n oder z.B. eine
Negation gebraucht wird.

Info: Suchen- und Ersetzenaktionen "s/x/y/" und die reinen Suchaktionen
"/x/" beziehen sich immer auf den "pattern space".



Wenn Deine Datei immer sauber so aufgebaut ist, dass in der ungeraden
Zeile ein %-Zeichen vorkommt und in der geraden der Text, dann
funktioniert obiges Beispiel von mir problemlos. Sollte dies einmal
nicht mehr der Fall sein, dann laeuft obiges Beispiel ins Leere.
Denn sed liest die ungerade Zeile ein, holt sie die gerade, macht seine
Suchen- und Ersetzenaktion und liest dann die naechste ungerade ein. Um
das nachzuvollziehen, kannst Du ja mal in Deine Datei eine zusaetzliche
Zeile mit einem % einfuegen.
--
Mit freundlichen Gruessen
J. Seyfferth

Aktionsseite des Pro Trinitron e.V.
http://www.forwiss.uni-passau.de/~berberic/trinitron.html
Nikolai Försterling
2006-05-27 11:14:43 UTC
Permalink
Post by J. Seyfferth
sed betrachtet normalerweise nur eine Zeile nach der anderen und da
auch nur den Inhalt.
Aaah!

Vielen Dank für die sehr ausführliche Erklärung.
Ich werde jetzt am Wochenende ausführhlich damit experimentieren.
;-)
--
lg Niko
________________________________
Das Gefühl findet, der Scharfsinn weiß die Gründe (Jean Paul)
Christoph 1
2006-05-27 17:26:02 UTC
Permalink
Post by Nikolai Försterling
Ich möchte nicht dumm sterben ;-)
Hallo Niko

deine Frage ist ja schon beantwortet, und es lag mehr an der sed
Benutzung, als an der RegExp, aber da wir hier ja in der kde Group
sind, will ich dich noch auf das KDE Programm kregexpeditor
hinweisen.

Da kannst du dir RegExp Ausdrücke mit der Maus einfach
zusammenklicken. Bei Suse wird das mit dem Paket kdeutils3-extra
installiert und findet sich dann im K-Menü unter Dienstprogramme/
Editor

Viele Grüße
Christoph
Nikolai Försterling
2006-05-27 18:07:22 UTC
Permalink
Post by Christoph 1
deine Frage ist ja schon beantwortet, und es lag mehr an der sed
Benutzung, als an der RegExp, aber da wir hier ja in der kde Group
sind, will ich dich noch auf das KDE Programm kregexpeditor
hinweisen.
Den hatte ich von kwrite aus auhc probiert, allerdings konnte die RegEx
in der Form wg. Begrenzung auf eine Zeile eben nicht funktionieren.
--
lg Niko
________________________________
Alles, was uns an anderen missfällt, kann uns zu besserer
Selbsterkenntnis führen (Carl Gustav Jung)
Lars Klemstein
2006-05-25 15:58:14 UTC
Permalink
Post by Nikolai Försterling
In dieser Datei möchte ich eigentlich nur ein Zeichen (%) und den darauf
folgenden Zeilenumbruch löschen/ersetzen, um die Zeilen anschließend
alphabetisch zu sortieren und den Umbruch nebst % wieder einzufügen.
(Wegen Übersicht und Doublettenvermeidung)
[...]

$ cat file
%
Talente finden Lösungen, Genies entdecken Probleme. (Krailsheimer)
%
Nihil est annis velocius (Ovid)
%
Bringen Sie die Lösung, oder sind Sie selbst das Problem?
___________________________________________________________


$ sed '/%$/N
Post by Nikolai Försterling
s/%\
//' file |sort | sed 's/^/%\
/'
___________________________________________________________
%
Bringen Sie die Lösung, oder sind Sie selbst das Problem?
%
Nihil est annis velocius (Ovid)
%
Talente finden Lösungen, Genies entdecken Probleme. (Krailsheimer)



Gruß,
Lars Klemstein
Nikolai Försterling
2006-05-26 11:51:02 UTC
Permalink
Post by Lars Klemstein
$ sed '/%$/N
Post by Nikolai Försterling
s/%\
//' file |sort | sed 's/^/%\
/'
Sorry, aber den Term verstehe ich nicht ganz.
sed "finde Muster %irgendwas""/N"
_______________________________^_(?)
Und speziell den bei s/%\// kann ich nicht nachvollziehen.
allerdings ist 'man sed' immer wieder sporadisch aktiv ;-)
--
lg Niko
________________________________
Es gehört viel Kraft dazu, Gefühle zu zeigen, die ins Lächerliche
gezogen werden können (Germaine Madame de Stael)
Helmut Hullen
2006-05-25 15:58:00 UTC
Permalink
Hallo, Nikolai,
Post by Nikolai Försterling
In dieser Datei möchte ich eigentlich nur ein Zeichen (%) und den
darauf folgenden Zeilenumbruch löschen/ersetzen, um die Zeilen
anschließend alphabetisch zu sortieren und den Umbruch nebst %
wieder einzufügen. (Wegen Übersicht und Doublettenvermeidung)
__________________________________________________________
%
Bringen Sie die Lösung, oder sind Sie selbst das Problem?
%
Nihil est annis velocius (Ovid)
%
Talente finden Lösungen, Genies entdecken Probleme. (Krailsheimer)
___________________________________________________________
Wenn Du sowieso sortieren willst: sortiere doch nur die Zeilen, die
nicht aus "%" bestehen.

grep -v "^%$" altedatei | sort > sortiert

Und nach dem Sortieren:

while read Zeile
do
echo "%"
echo "$Zeile"
done < sortiert > neuedatei

Viele Grüße!
Helmut
Nikolai Försterling
2006-05-26 11:59:35 UTC
Permalink
Post by Helmut Hullen
Wenn Du sowieso sortieren willst: sortiere doch nur die Zeilen, die
nicht aus "%" bestehen.
Ist eigentlich egal, ob ich vorher oder hinterher sortiere, nur habe ich
auch ein paar Dateien, in denen streckenweise auch mal keine Zeilen mit
% vorkommen, daher erstmal normalisieren.
Post by Helmut Hullen
grep -v "^%$" altedatei | sort > sortiert
while read Zeile
do
echo "%"
echo "$Zeile"
done < sortiert > neuedatei
Das klingt schön einfach, um eine %-Zeile einzufügen, ich hätte da
wieder was mit sed zu basteln versucht.
Danke ;-)
--
lg Niko
________________________________
lles, was du nicht zu geben weißt, besitzt dich (André Gide)
Jogi Kuenstner
2006-05-28 21:01:17 UTC
Permalink
Post by Nikolai Försterling
Erstmal sorry für den xpost, passt m.E. in beide Gruppen.
Ich habehier eine textdatei, die ich mangels ausreichender Erfahrung mit
Regular Expressions mit kwrite bzw. dem RexEx-Editor (schande über
mich) bearbeite.
[...]
Dein Problem hast Du ja geloest, ich wollte Dich nur noch kurz auf den
Regex-Coach (Siehe : http://www.weitz.de/regex-coach/ )
aufmerksam machen, mit dem versuche ich immer meine Kenntnisse bzgl.
Reg-Expressions zu verbessern...
Gibt's fuer Linux und Windows.

Jogi
--
The particular mistake will not be repeated. There are plenty of
mistakes left that have not yet been used. A. Tanenbaum
***@kuenstner.de
Nikolai Försterling
2006-05-28 22:07:14 UTC
Permalink
Post by Jogi Kuenstner
Dein Problem hast Du ja geloest, ich wollte Dich nur noch kurz auf den
Regex-Coach (Siehe : http://www.weitz.de/regex-coach/ )
aufmerksam machen, mit dem versuche ich immer meine Kenntnisse bzgl.
Reg-Expressions zu verbessern...
Schaue ich mir mal an, danke für den Tip.
--
lg Niko
________________________________
Die Leute streiten im allgemeinen nur deshalb, weil sie nicht
diskutieren können. (Gilbert Keith Chesterton)
Loading...