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: