Wyizolować ciąg z losowego ciągu

Posted on Fri 24 September 2004 in Tips text {sed, awk, perl, etc.}

Jedna rzecz nie daje mi spokoju. Mając losowy ciąg, z losową ilością "foo" (np.: abcfoorkdfooplffooplffoofoo), chciałbym wyizolować i wyświetlić wszystkie foo, resztę eliminując.

echo abcfoorkdfooplffooplffoofoo | sed 's/.*\(foo\).*/\1/'
wyświetla mi tylko ostatnie foo. Zakładam że ilość i rozmieszczenie "foo" w ciągu są losowe... co trochę komplikuje mi rozwiązanie.
Widzi mi się to następująco:
$ echo abcfoorkdfooplffooplffoofoo | sed 'do magic'
foo   foo   foo   foofoo
Po prostu podaję wzorzec i wszystko co do niego nie pasuje jest usuwane (albo zastępowane np spacją). Takie "odwrotne" 's/foo/shmoo/g'.
Może nada się do tego jakieś inne narzędzie?
To trochę sztuka dla sztuki, ale żeby pokazać, że sedem też można:
sed \
'h;s/.*/foo/;x;:A;/foo/!b B;s/foo//;x;s/\(.*\)/\1 foo/;x;b A;:B;x;s/foo//'

Naturalnie, można to zrobić bardzo łatwo narzędziami typu awk, perl itp.