Wyizolować ciąg z losowego ciągu

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.