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

Re: Sed Verständnisproblem



Hallo Christian,

Christian Frommeyer <debian@frommeyer.name> wrote:
> Am Donnerstag 08 September 2005 19:31 schrieb Markus Schulz:
> > echo "Bad Neu  brandenburg" | sed -e
> > 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' => Bad Neu  brandenburg
> > ^^ funktioniert nicht mit den zwei Spaces.
> 
> Da Du \W* schreibst nimmt er halt auch nichts. Dann matched sed
> erst "e" und "u" und geht dann weiter und findet "b" und "r". Die
> Paarung "u" und "b" mit den spaces dazwischen findet er so nicht.
> Weil sed -e kein "+" statt "*" kennt muß man das halt basteln:
> 's/\([a-z]\)\W\W*\([a-z]\)/\1\2/g'
> 
> oder halt gleich:
> sed -r 's/([a-z])\W+([a-z])/\1\2/g'

Geht aber z.B. bei "Bad Ne  u  brandenburg" auch nicht, weil

Bad Ne  u  brandenburg
     |--|
     1. gefundene Stelle, wird ersetzt durch "eu"
dann sieht der pattern space im sed so aus
Bad Neu  brandenburg
        |- ab hier wird dann weiter gesucht
Damit wird das Pattern nicht mehr gefunden und "u  b" somit
nicht ersetzt. Das Problem lässt sich aber itterativ lösen.

Mein Vorschlag wäre:
sed -e ':x;s/\(.*[A-Za-z]\) \+\([a-z]\)/\1\2/g;tx'

:x - setzt ein Label 
s/\(.*[A-Za-z]\) \+\([a-z]\) - findet "[A-Z] [a-z]" und
     "[a-z] [a-z]", mit " " >=1 dazwischen, 
     durch das ".*"es wird immer nach dem am weitesten rechts liegende
     Pattern gesucht
\1\2 - dürfte klar sein
tx - wird das angegebene Pattern gefunden wird am Label x fortgesetzt

Ich hoffe die Erklärung ist leicht verständlich. ;-)

Frank
-- 
A: Because it breaks the logical sequence of discussion
Q: Why is top posting bad?



Reply to: