[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Sed Verständnisproblem



On 2005-09-09 23:00:40 +0200, Gebhard Dettmar wrote:
> On Friday 09 September 2005 13:21, Michael Bienia wrote:
> > Wenn jetzt Perl mit dabei ist, dann sollte man auch die Möglichkeiten
> > der Perl Regex nutzen:
> > echo "Bad Ne  u  branden burg" |perl -pe
> > 's/(?<=[A-Za-z])\s+(?=[a-z])//g'
> 
> Das sind aber extended Patterns. Die raff ich nicht (A zero-width positive 
> look-behind assertion., les ich grade. Ah ja ;-) Und wie gehen deine 
> beiden Ausdrücke zusammen?
> Also: ?<=[A-Za-z])\s+ heißt, wenn ich das Beispiel aus der manpage richtig 
> übertrage: Ein oder mehr Leerzeichen, gefolgt von Groß- oder 
> Kleinbuchstabe.

Fast. Falsche Richtung, es ist eine Look-behind-Zusicherung. Ich schaue
links von einem oder mehr Leerzeichen, ob da ein Groß- oder
Kleinbuchstabe ist, ohne diesen Buchstabe zum Treffer zu zählen.

> Und wie lese ich s+(?=[a-z])

Das ist eine Look-ahead-Zusicherung, ich schaue rechts vom einem oder
mehr Leerzeichen ob da ein Kleinbuchstabe folgt, wiederum ohne es zum
Treffer zu zählen.

> Was meint "without including the tab in $&." in der Manpage (man perlre)?

In $& (aka $MATCH) wird der letzte Treffer vom Pattern-Matching
gespeichert. Das bedeutet bei dem Beispiel aus der Manpage
"/\w+(?=\t)/", dass in $& nur das Wort (\w+) gespeichert wird, aber im
Suchtext ein Wort gefolgt von einem Tab enthalten sein muss.

> Das einzige, was ich hier schnalle, ist, dass du nur Leerzeichen zwischen 
> Kleinbuchstaben ersetzt, um BadN... zu vermeiden. 
 
Das Pattern nochmal kurz erklärt:
- suche nach einem oder mehr Leerzeichen: \s+
- vor den Leerzeichen muss ein Groß- oder Kleinbuchstabe sein:
  (?<=[A-Za-z])
- nach den Leerzeichen muss ein Kleinbuchstabe sein
  (?=[a-z])

Perl durchsucht jetzt den Suchstring nach einem oder mehr Leerzeichen,
für die die beiden Zusicherungen erfüllt sind. In $& haben wir dann nur
die Leerzeichen \s+, die Buchstaben gehören nicht dazu.

Da der nachfolgende Buchstabe beim Suchen noch nicht verbraucht wurde
(wir haben ihn uns nur angesehen), kann Perl dort wieder ansetzen.

Michael



Reply to: