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.