Re: Sed Verständnisproblem

2005-09-11 Diskussionsfäden Gebhard Dettmar
Hallo Michael,
On Saturday 10 September 2005 11:21, Michael Bienia wrote:
> 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.
>
Genial, bin beeindruckt. Für die Erläuterung bin bestimmt nicht nur ich 
dir dankbar (dito für Frank) :-)
> Michael
Gebhard

-- 
Caution: breathing may be hazardous to your health.



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Gebhard Dettmar
On Friday 09 September 2005 13:21, Michael Bienia wrote:
> On 2005-09-09 11:12:52 +0200, Gebhard Dettmar wrote:
> > On Thursday 08 September 2005 21:49, Frank Dietrich wrote:
> > 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
>
> 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. Und wie lese ich s+(?=[a-z])
Was meint "without including the tab in $&." in der Manpage (man perlre)?
Das einzige, was ich hier schnalle, ist, dass du nur Leerzeichen zwischen 
Kleinbuchstaben ersetzt, um BadN... zu vermeiden. 
> Michael
Gebhard

-- 
Q:  What do you call a blind pre-historic animal?
A:  Diyathinkhesaurus.

Q:  What do you call a blind pre-historic animal with a dog?
A:  Diyathinkhesaurus Rex.



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Frank Dietrich
Hallo Gebhard,

Gebhard Dettmar <[EMAIL PROTECTED]> wrote:
> On Friday 09 September 2005 13:40, Frank Dietrich wrote:
> > Intern sieht das vereinfach so aus:
> >   F O O B A R  FOOBAR
> > |-- sed merkt sich diese Postion
> >
> >   FO O B A R  FOOBAR
> >  |-| das ist das nächste gefundene Pattern
> >  |
> >|-- sed merkt sich diese Postion
> 
> Das heißt, sed steht beim Leerzeichen zwischen FO O
> und schnappt sich das nächste pattern, das durch die
> Zeilenverkürzung erst O B ist? 

Ja. Er sieht so zusagen " O B A R  FOOBAR" als noch zu bearbeitende
Zeichenfolge.

> Also letztlich als Regel: Dank der
> bei jeder Ersetzung entstehenden Zeilenverkürzung entgeht ihm jedes
> Zweite? und Perl hat eine andere regex-Maschine, die dieses Problem
> nicht hat?

Kenne mich mit Perl leider nur sehr wenig aus (eigentlich fast
garnicht). Es könnte aber durchaus sein, das Perl bei der Option
"ersetze alle" die Wiederholungen (also Label x und tx, im sed) von
Haus aus macht.
Da müsste man mal auf einer Perl-Liste nachfragen.

Frank
-- 
Ist das jetzt ein Klischee, daß überall auf der Welt erfolgreichen
Nerd-Programmierer allein in ihrem stillen Kämmerchen sitzen und sich
alles völlig allein aus irgendwelchen Handbüchern beibringen?



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Gebhard Dettmar
hallo Frank,
Super, vielen Dank. Ich frag zur Sicherheit nochmal nach, s.u.
On Friday 09 September 2005 13:40, Frank Dietrich wrote:
> Hallo Gebhard,
>
>
> > [...]
>
> Angenommen Du sollst in einem Text "alle F O O B A R und FOOBAR in
> Foobar wandeln.
> Dann könnte man es in Pseudocode so lösen (dient nur als Beispiel,
> und ist deshalb nur auf diesen einen Fall zugeschnitten):
> - zuerst alle einzelnen Leerzeichen zwischen zwei Großbuchstaben
>   löschen
> - dann alle FOOBAR durch Foobar ersetzen
>
> # alle einzelnen Leerzeichen zwischen zwei Großbuchstaben löschen
> echo "F O O B A R  FOOBAR" | sed -e 's/\([A-Z]\) \([A-Z]\)/\1\2/g'
>   Das geht deswegen schief, weil sich die Zeile während der
>   Bearbeitung verkürzt.
>
> Intern sieht das vereinfach so aus:
>   F O O B A R  FOOBAR
>
> |-- sed merkt sich diese Postion
>
>   FO O B A R  FOOBAR
>
>  |-| das ist das nächste gefundene Pattern
>  |
>|-- sed merkt sich diese Postion

Das heißt, sed steht beim Leerzeichen zwischen FO O
und schnappt sich das nächste pattern, das durch die Zeilenverkürzung erst 
O B ist? Also letztlich als Regel: Dank der bei jeder Ersetzung 
entstehenden Zeilenverkürzung entgeht ihm jedes Zweite?
und Perl hat eine andere regex-Maschine, die dieses Problem nicht hat?
>
>   FO OB A R  FOOBAR
>
> |-| das ist das nächste gefundene Pattern
>
>   FO OB AR  FOOBAR
> und das kommt als Ergebnis raus
>
> [...] 
Rest klar
>
> Hoffe noch ein wenig Licht ins Dunkel gebracht zu haben.

Ja, ich dank dir sehr
> Frank
Gebhard



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Frank Dietrich
Hallo Gebhard,

Gebhard Dettmar <[EMAIL PROTECTED]>
wrote:
> On Thursday 08 September 2005 21:49, Frank Dietrich wrote:
> > 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

Wurde von Mario schon erläutert.

> und die Erklärung zu Labels in der sed manpage ( Label for b and t
> commands???) auch nicht ;-(

Es wird sicher leichter verständlich wenn man die Anweisungen nicht
auf eine Zeile pappt sondern diese mittels einem Skript an sed
übergibt.

Angenommen Du sollst in einem Text "alle F O O B A R und FOOBAR in
Foobar wandeln.
Dann könnte man es in Pseudocode so lösen (dient nur als Beispiel,
und ist deshalb nur auf diesen einen Fall zugeschnitten):
- zuerst alle einzelnen Leerzeichen zwischen zwei Großbuchstaben
  löschen
- dann alle FOOBAR durch Foobar ersetzen

# alle einzelnen Leerzeichen zwischen zwei Großbuchstaben löschen
echo "F O O B A R  FOOBAR" | sed -e 's/\([A-Z]\) \([A-Z]\)/\1\2/g'
  Das geht deswegen schief, weil sich die Zeile während der
  Bearbeitung verkürzt.

Intern sieht das vereinfach so aus:
  F O O B A R  FOOBAR
|-- sed merkt sich diese Postion
  FO O B A R  FOOBAR
 |-| das ist das nächste gefundene Pattern
   |-- sed merkt sich diese Postion
  FO OB A R  FOOBAR
|-| das ist das nächste gefundene Pattern
  FO OB AR  FOOBAR
und das kommt als Ergebnis raus

Lösung bringt hier die mehrmalige Wiederholung des sed Kommandos.
Oder als Pseudocode:
- wiederhole solange bis das Pattern nicht mehr gefunden wird

Als Skript lässt sich das dann so schreiben:

--- sample.sed ---
:x-- Label x
s/\([A-Z]\) \([A-Z]\)/\1\2/g  -- das auszuführende Kommando
t x   -- wenn durch das s Kommando
 etwas getauscht wurde, letzte
 Zeile nochmal einlesen und
 Abarbeitung bei Label x fortsetzen
 ansonsten nächstes Kommando
 abarbeiten
s/FOOBAR/Foobar/g -- ersetzt alle FOOBAR durch Foobar
--

Aufgerufen wird das dann so:
  echo "F O O B A R  FOOBAR" | sed -f sample.sed

Intern passiert dann folgendes:

Ausgangszeile
  F O O B A R  FOOBAR

nach dem ersten Durchlauf, enthält die Zeile
  FO OB AR  FOOBAR

da eine Ersetzung erfolgt ist wird mit dieser Zeile nochmal ein
Durchlauf gestartet, danach sieht die Zeile so aus
  FOOBAR  FOOBAR

da eine Ersetzung erfolgt ist ("O O" und "B A") wird mit dieser Zeile
nochmal ein Durchlauf gestartet
  FOOBAR  FOOBAR

nach diesem Durchlauf wurde keine Ersetzung mehr durchgeführt, d.h.
"t x" springt nicht mehr zum Label x und s/FOOBAR/Foobar/g wird
ausgeführt 

Da es sich um ein relativ kurzes sed-Skript handelt kann man die
Kommandos auch mit ";" getrennt auf eine Zeile schreiben und sed mit
"-e" übergeben. Bei komplexeren Skripten leidet da natürlich die
Lesbarkeit und Fehler lassen sich auch nicht mehr so einfach finden.

Hoffe noch ein wenig Licht ins Dunkel gebracht zu haben.
Frank
-- 
If code looks clumsy, it can usually be better written. Clean code
is more easily maintainable and modifiable.



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Mario 'BitKoenig' Holbe
Gebhard Dettmar <[EMAIL PROTECTED]> wrote:
> Nicht ganz. Das \+ (bzw. das Quoting vor dem +) verstehe ich nicht und die 

sed versteht eigentlich nur regex, + ist eregex. Deshalb \+ - quasi als
Transition von eregex features nach regex.


regards
   Mario
-- 
User sind wie ideale Gase - sie verteilen sich gleichmaessig ueber alle Platten


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Sed Verständnisproblem

2005-09-09 Diskussionsfäden Gebhard Dettmar
On Thursday 08 September 2005 21:49, Frank Dietrich wrote:
> Hallo Christian,
>
> Christian Frommeyer <[EMAIL PROTECTED]> 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!



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Martin Grandrath
Hallo Markus!

On Thu, 8 Sep 2005 20:28:12 +0200 Markus Schulz <[EMAIL PROTECTED]> wrote:

>aber warum geht das mit extended regexp style und mit normalen nicht?

Bin mir nicht sicher, aber ich meine die '\1\2' gehören zu extended.

Gruß,
Martin


-- 
.--.
   |o_o | __   _Powered by
   |:_/ |/ /  (_)___   __  __   __
  //   \ \  / /  / // __ \/ / / / \/ /
 (| | )/ /__/ // / / / /_/ / >  <
 /'\_   _/`\  //_//_/ /_/_/ /_/\_\
 \___)=(___/


pgpK7Qn8GgF1m.pgp
Description: PGP signature


Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Frank Dietrich
Hallo Christian,

Christian Frommeyer <[EMAIL PROTECTED]> 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?



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Christian Frommeyer
Am Donnerstag 08 September 2005 20:56 schrieb Markus Schulz:
> Warum er aber nicht immer ein Zeichen in den Testbuffer dazunimmt,
> sondern hier gleich zwei, erschließt sich mir nicht. Habe aber auch
> selbst noch nie solch einen Erkennungsautomaten entwickelt.

Naja, er sucht das erste, was auf das Muster passt. das ist nach "Bad" 
dann "eu" das ersetzt er (halt wieder mit "eu") und das nächste was 
passt (muss ja mit einem Kleinbuchstaben anfangen) ist dann "br". Die 
Paarung die er eigentlich finden soll findet er deshalb nicht. Das käme 
wohl auch zu komischen Resultaten, wenn man beim ersetzten immer wieder 
darauf achten müsste, das das Suchmuster nicht zufällig wieder passt.

Gruß Chris

-- 
A: because it distrupts the normal process of thought
Q: why is top posting frowned upon



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Markus Schulz
Am Donnerstag, 8. September 2005 20:22 schrieb Christian Frommeyer:
> Am Donnerstag 08 September 2005 19:31 schrieb Markus Schulz:
> > ich habe ein Problem mit sed. Ich versuche aus Zeichenketten
> > Leerzeichen zu entfernen, die sich nur zwischen kleinen Buchstaben
> >
> > dafür habe ich folgende Expressions:
> > sed -e 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' \
> > -e 's/\([A-Z]\)\W*\([a-z]\)/\1\2/g'
>
> Also \W nimmt alle nicht alphanumerischen Zeichen. Wenn Du also nur
> Leerzeichen entfernen willst, vielleicht nicht was Du suchst.
>
> > 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.

hmm okay, das lässt sich sogar reproduzieren durch Anhängen von 2*n 
Zeichen an "Neu" geht es nicht und bei 2*n+1 geht es.
Warum er aber nicht immer ein Zeichen in den Testbuffer dazunimmt, 
sondern hier gleich zwei, erschließt sich mir nicht. Habe aber auch 
selbst noch nie solch einen Erkennungsautomaten entwickelt.

> 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'

okay, thx. 
das reicht mir als Erklärung und Lösung :)

-- 
Markus Schulz

"Ein zukünftiges Start-up mit keinen eigenen Patenten wird gezwungen 
sein, jeglichen Preis zu bezahlen, den die Branchenriesen ihm 
auferlegen wollen. Der Preis könnte hoch sein: Etablierte Unternehmen 
haben ein Interesse daran, künftige Konkurrenten auszuschließen." 
Bill Gates (1991)



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Markus Schulz
Am Donnerstag, 8. September 2005 20:13 schrieb Martin Grandrath:
> Hallo Markus!
>
> On Thu, 8 Sep 2005 19:31:35 +0200 Markus Schulz <[EMAIL PROTECTED]> 
wrote:
> >sed -e 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' \
> > -e 's/\([A-Z]\)\W*\([a-z]\)/\1\2/g'
>
> Versuch doch mal
>
> sed -r -e 's/([A-Za-z])\W*([a-z])/\1\2/g'

danke erstmal.
aber warum geht das mit extended regexp style und mit normalen nicht?

eine Lösung von Wolfgang Ulmer (private Mail) war mit Word-Boundarys 
(\b) vor und hinter dem \W* zu arbeiten. Das funktioniert auch ohne 
extended Style, verstehen tut er (und ich) das aber auch nicht.

-- 
Markus Schulz

> >Is that verb regular?  Does "ich kann den Mond sprengen" sound less
> >awkward than "ich kann den Mond explodieren" ?
> The first sentence is correct, the second one is just nonsense. But 
you will need quite a big amount of explosives to do so.
I'm sure America has plenty.  :)



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Christian Frommeyer
Am Donnerstag 08 September 2005 19:31 schrieb Markus Schulz:
> ich habe ein Problem mit sed. Ich versuche aus Zeichenketten
> Leerzeichen zu entfernen, die sich nur zwischen kleinen Buchstaben

> dafür habe ich folgende Expressions:
> sed -e 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' \
> -e 's/\([A-Z]\)\W*\([a-z]\)/\1\2/g'

Also \W nimmt alle nicht alphanumerischen Zeichen. Wenn Du also nur 
Leerzeichen entfernen willst, vielleicht nicht was Du suchst.

> 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'

Gruß Chris

-- 
A: because it distrupts the normal process of thought
Q: why is top posting frowned upon



Re: Sed Verständnisproblem

2005-09-08 Diskussionsfäden Martin Grandrath
Hallo Markus!

On Thu, 8 Sep 2005 19:31:35 +0200 Markus Schulz <[EMAIL PROTECTED]> wrote:

>sed -e 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' \
> -e 's/\([A-Z]\)\W*\([a-z]\)/\1\2/g'

Versuch doch mal

sed -r -e 's/([A-Za-z])\W*([a-z])/\1\2/g'


Gruß,
Martin


-- 
.--.
   |o_o | __   _Powered by
   |:_/ |/ /  (_)___   __  __   __
  //   \ \  / /  / // __ \/ / / / \/ /
 (| | )/ /__/ // / / / /_/ / >  <
 /'\_   _/`\  //_//_/ /_/_/ /_/\_\
 \___)=(___/


pgpLAONwR3Is2.pgp
Description: PGP signature


Sed Verständnisproblem

2005-09-08 Diskussionsfäden Markus Schulz
Hallo,

ich habe ein Problem mit sed. Ich versuche aus Zeichenketten Leerzeichen 
zu entfernen, die sich nur zwischen kleinen Buchstaben bzw. vor 
Whitespace ein Großbuchstabe und hinter ein Kleinbuchstabe.
Z.B.
"Bad Hers  feld" => Bad Hersfeld
"B ad Hers  feld" => Bad Hersfeld
usw.

dafür habe ich folgende Expressions:
sed -e 's/\([a-z]\)\W*\([a-z]\)/\1\2/g' \
-e 's/\([A-Z]\)\W*\([a-z]\)/\1\2/g'

und das funktioniert leider sehr eigenartig.
z.B. (zweite expression mal weggelassen, da egal)

echo "Bad Hers  feld" | sed -e 
's/\([a-z]\)\W*\([a-z]\)/\1\2/g' => Bad Hersfeld

^^ funktioniert wie erwartet.

echo "Bad Neu  brandenburg" | sed -e 
's/\([a-z]\)\W*\([a-z]\)/\1\2/g' => Bad Neu  brandenburg

^^ funktioniert nicht mit den zwei Spaces.

echo "Bad Neus  brandenburg" | sed -e 
's/\([a-z]\)\W*\([a-z]\)/\1\2/g' => Bad Neusbrandenburg

^^ funktioniert eigenartiger Weise, obwohl auch zwei Spaces und nur ein 
's' an Neu angehangen...
da ist doch irgendwie der Wurm drin?!?

Jemand eine Idee?

-- 
Markus Schulz

This is Linux Land-
In silent nights you can hear the windows machines rebooting