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

Re: Sed Verständnisproblem



On Thursday 08 September 2005 21:49, Frank Dietrich wrote:
> Hallo Christian,
>
> Christian Frommeyer <debian@frommeyer.name> wrote:
> > [...]
> > 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. ;-)

Nicht ganz. Das \+ (bzw. das Quoting vor dem +) verstehe ich nicht und die 
Erklärung zu Labels in der sed manpage ( Label for b and t commands???) 
auch nicht ;-(
Ich hätte es jetzt so gemacht:
echo "Bad Ne  u  brandenburg" |perl -pe 's/\s\s{1,2}//g'
oder mit zusätzlichen zufälligen leerzeichen zwischen Kleinbuchstaben
echo "Bad Ne  u  branden burg" |perl -pe 's/\s+//g' |sed -e 
's/\([a-z]\)\([A-Z]\)/\1 \2/'
aber das ist natürlich geschummelt
>
> Frank
Gruß Gebhard
-- 
Never give an inch!



Reply to: