sed und Oder-Verknüpfung

Manjo

Aktives Mitglied
Thread Starter
Dabei seit
25.07.2005
Beiträge
906
Reaktionspunkte
24
Hallo!

Die Manpage von sed schweigt sich über Details bei den regulären Ausdrücken aus. Normalerweise kann man mit

echo "Hallooo" | sed -e 's/ooo|kkk/o/g'
echo "Hallkkk" | sed -e 's/ooo|kkk/o/g'

alle ooo- oder kkk-Vorkommen finden und diese durch 'o' ersetzen. Demnach liefern beide Zeilen oben das gleiche Ergebnis. Nicht so unter OsX. Das Muster wird garnicht erst gefunden.

Wer weiß Rat?

Viele Grüße
Manjo
 
du musst es wohl in klammern setzen (ooo|kkk)...
schau doch mal in
man re_format
man regex
 
Ich kämpfe auch REgelmäßig mit REs und finde meist bei den Regenechsen oder hier Hilfe ;)


?=?
 
...
Demnach liefern beide Zeilen oben das gleiche Ergebnis. Nicht so unter OsX.
...
sed ist nicht gleich (gnu)sed
gnused entspricht nicht den SUSv3. Daraus resultieren immer wieder Verwirrung und Inkompatibilität

Ich hätte jetzt auch die von oneOeight genannten manpages empfohlen. Allerdings sind die auch nicht wirklich leicht verständlich. Da muss man sich halt durchbeißen.
 
Warum sollte ich dort Klammern setzen? Das bräuchte ich in dem Fall nur, wenn ich den Inhalt der gefundenen Ausdrücke beim Ersetzen wieder verwenden will. Zudem muss es dann \(ooo\) heißen, weil sed das so verlangt.

Das Problem ist nicht, die regs zu bauen, das Problem ist, wie sed die Ausdrücke interptretiert. Und das tut sed und OsX scheinbar vollkommen anders als unter anderen OSs. Schade.

Aber es muss doch ein "Oder" geben für sed auch unter OsX?
 
Die Lösung ist letztendlich ganz einfach und durch entsprechendes Studium der manpages (auf die oben zwei mal explizit hingewiesen wurde) auch zu finden :D:

Code:
echo Hallooo Hallkkk | sed -Ee 's#ooo|kkk#o#g'
Hallo Hallo
Alternativen sind möglich, zB.
Code:
echo Hallooo Hallkkk | sed -Ee 's#(ooo|kkk)#o#g'
Hallo Hallo
oder
Code:
echo Hallooo Hallkkk | sed -Ee 's#(ooo)|(kkk)#o#g'
Hallo Hallo
Die Klammern sind hier allerdings Makulatur, solange man nicht mit "bounds" arbeitet.

Das Problem war also doch, "die regs zu bauen" ;).

HTH
 
Zuletzt bearbeitet:
Das Problem war also doch, "die regs zu bauen" ;).
. . . oder das "-E" zum Umschalten auf die "modern" a.k.a. "extended" REs (steht aber auch in den man-pages) ;)

Das "-E" (oder "-P") brauche ich aber auch regelmäßig unter Linux . . .
Mein größtes Problem mit den REs sind auch weniger die REs selber, sondern dass sie (meiner subjektiven Verwirrung gemäß :( ) oft in der gerade nicht vermuteten Variante interpretiert werden . . .


?=?
. . . der hier nicht Experte, sondern "mitfühlender Laie" ist:rolleyes:
 
Schon die Tatsache, dass es zwei "Arten" von regex gibt ist (ich zitiere die manpage) "Pfusch".
Hinzukommt, dass die POSIX Spezifikation hier Fehler enthält, die eine saubere Implementation unmöglich machen.
Aber damit nicht genug, fährt Linux hier wieder mal ne Sondernummer mit gnused, was weitere Verwirrung stiftet und nicht gerade der Portabilität dient.

Trotzdem ist die Lösung für das hier vorliegende Problem einfach.
Aber wie man weiß, sind Rätsel ja immer einfach, wenn man die Lösung kennt :D.
 
oder man macht sich das portable leben einfacher und nimmt perl -pe statt sed...
 
Zurück
Oben Unten