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