konkretni problem regexp (sed)
Michal Bozon
bozonm na usersold.vscht.cz
Neděle Červen 8 13:02:12 CEST 2003
> > > chci vyextrahovat prvni souvislou radu cisel z retezce, napriklad
> > > "as-dff42583f_sd" -> "42583"
> > >
> > > $ echo "as-dff42583f_sd" | sed 's/.*\([0-9]\+\).*/\1/'
> > > 3
>
> ta prvni hvezdicka je hladova, nejprve zpapa uuuplne vsechno a pak
> se backtrackuje postupne zpet
>
> takze nejen ze to nefunguje, ale jeste je to neefektivni :-)
>
> > >
> > > napravit to jde takhle:
> > >
> > > $ echo "as-dff42583f_sd" | sed 's/.*[^0-9]\([0-9]\+\).*/\1/'
> > > 42583
> > >
> > > Proc nedostanu stejny vysledek i v prvnim propade? Jedna se pri
> > > vyhodnocovani .* a [0-9]\+ k nejakemu stretu zajmu? Existuje jistejsi
> > > zpusob reseni meho problemu?
> >
> > Protože v prvním případě to opravdu není jednoznačné: vy si sice
>
> jednoznacne to je (hladova hvezdicka proste zhltne co muze), jen to
> nedela, co autor ocekaval
Predpokladal jsem, ze .* bude mit jaksi nizsi prioritu. No abych pravdu
rekl, nelibi se mi ani jedno navrhovane reseni.. Byl to modelovy pripad a
ve skutecnosti mi slo o vyextrahovani IP z retezce.
Michal
>
> > představujete, že úvodní '.*' reprezentuje 'as-dff', ale ono to zrovna tak
> > dobře může být tak, že '.*' -> 'as-dff4258' a a '[0-9]+' -> '3'.
> > Pokud si dobře vzpomínám, v případě nejednoznačnosti má přednost ta část,
> > která je dřív, v tomto případě '.*'. Ve druhém případě už jste
> > nejednoznačnost vyloučil, takže sed nemá na výběr.
>
> jak jsem napsal vyse -- nejde o nejednoznacnost, ale 'hladovost'
>
> napriklad v perlu, nebo ruby existuje jeste 'stridma' verze hvezdicky
> (nejen), ktera se pise "*?", a matchuje nejmensi mozny pocet znaku
>
> takze by slo psat neco jako 's/.*?\([0-9]\+\).*/\1/'
>
> --
> Martin Povolný, xpovolny na fi.muni.cz, http://www.fi.muni.cz/~xpovolny
>
>
Další informace o konferenci Linux