Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Uran 16 Října 2009, 21:16:04

Název: vypsani retezce, jeden radek
Přispěvatel: Uran 16 Října 2009, 21:16:04
Mam takovy problem. Potrebuju v nejakem textu nalezt urcity retezec a nejak se nedari.
Situaci komplikuje fakt, ze se jedna o text na jedne radce a navic retezec ma promenou cast. Kdyz pouziju grep tak mi logicky vypise cely text.

Zkousel jsem grep, sed ..., ale nejak mi nedochazi jak na to.

Jedine reseni ktere jsem nasel je znacne prasacke. Pomoci tr jsem nahradil vsechny mezery novym radkem a pak na to pustil grep. Neco takoveho:

Nejak takhle mam na mysli ten text (xx* potrebuji vypsat)
Kód: [Vybrat]
sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf xxyyy drserser gfhgfhfg sadadsad xxccc wewqewr xxaaa frerwrewrwr
Kód: [Vybrat]
$cat file | tr ' ' '\n' | grep "hledany retezec"
Chtel bych se zeptat zdali neexistuje nejaky jednodusi postup?

Dekuji.
Název: Re: vypsani retezce, jeden radek
Přispěvatel: premet 16 Října 2009, 21:24:43
Hm a co takhle awk  :)
Např.
Kód: [Vybrat]
echo "sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf " | awk ' {print $1}'vypíše → sfsdf
Kód: [Vybrat]
echo "sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf " | awk ' {print $2}'vypíše → sf

atd ...

A aby jsi to nemusel filtrovat přes grep tak třeba
Kód: [Vybrat]
echo -e "foo bar\n neco neco\n blah" | awk '/foo/ {print $1}'vypíše → foo
Název: Re: vypsani retezce, jeden radek
Přispěvatel: Uran 16 Října 2009, 21:52:20
Hm a co takhle awk  :)
Např.
Kód: [Vybrat]
echo "sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf " | awk ' {print $1}'vypíše → sfsdf
Kód: [Vybrat]
echo "sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf " | awk ' {print $2}'vypíše → sf

atd ...

A aby jsi to nemusel filtrovat přes grep tak třeba
Kód: [Vybrat]
echo -e "foo bar\n neco neco\n blah" | awk '/foo/ {print $1}'vypíše → foo

Tak asi jsem se spatne vyjadril ja potrebuji z te jedne radky vypreparovat vsechny vyskyty toho castecne promeneho retezce a awk '{print $n}' mi prece vypise jen n-ty retezec?
Navic aby to nebylo prilis jednoduche tak v tom souboru je techto "dlouhych" radek nekolik.
Název: Re: vypsani retezce, jeden radek
Přispěvatel: arrange 16 Října 2009, 21:58:07
Takhle nějak?
grep -o <řetězec_k_hledání> <soubor>
Název: Re: vypsani retezce, jeden radek
Přispěvatel: LuciusMare 16 Října 2009, 22:27:59
Mam takovy problem. Potrebuju v nejakem textu nalezt urcity retezec a nejak se nedari.
Situaci komplikuje fakt, ze se jedna o text na jedne radce a navic retezec ma promenou cast. Kdyz pouziju grep tak mi logicky vypise cely text.

Zkousel jsem grep, sed ..., ale nejak mi nedochazi jak na to.

Jedine reseni ktere jsem nasel je znacne prasacke. Pomoci tr jsem nahradil vsechny mezery novym radkem a pak na to pustil grep. Neco takoveho:

Nejak takhle mam na mysli ten text (xx* potrebuji vypsat)
Kód: [Vybrat]
sfsdf sf gdhfg hfgh gfh fhf hf  hf hfh fh fh fhf xxyyy drserser gfhgfhfg sadadsad xxccc wewqewr xxaaa frerwrewrwr
Kód: [Vybrat]
$cat file | tr ' ' '\n' | grep "hledany retezec"
Chtel bych se zeptat zdali neexistuje nejaky jednodusi postup?

Dekuji.
Já na tom nevidím nic prasáckého,dokonce bych řekl že je to zajímavý hack :)
Název: Re: vypsani retezce, jeden radek
Přispěvatel: Nemo7 20 Října 2009, 12:42:40
Já na tom nevidím nic prasáckého,dokonce bych řekl že je to zajímavý hack :)

Mně se to také nelíbí, přes Perl to jde třeba takto :
Kód: [Vybrat]
echo "aaaa bbb cc aaa" | perl -ne '@vzor = ($_ =~ /(aa+)/g); foreach (@vzor) {print "$_;"}'
Můj příklad vypíše každý řetězec, který má víckrát za sebou "a" a oddělí je středníkem. Místo echo tam jde dát třeba cat a na jednom výsledném řádku je pak výskyt všech možností v souboru.

Název: Re: vypsani retezce, jeden radek
Přispěvatel: nettezzaumana 22 Října 2009, 00:49:54
Kód: [Vybrat]
> cat foo
sfsdf sf gdhfg hfgh gfh fhf hf hf hfh fh fh fhf xxyyy drserser gfhgfhfg sadadsad xxccc wewqewr xxaaa frerwrewrwr
Kód: [Vybrat]
perl -ne 'do { next if !s/^(xx\w+)/$1,/; print } foreach split /\s+/' foo
@ Nemo7 .. tvuj perl vyraz rozhodne nejde pokud tam nejsou jen *stejne znaky v retezci a navic se obavam, ze by fungoval jen na jeden radek ..

> perl -nE 'do { say if /^xx/; } foreach split /\s+/' foo
xxyyy
xxccc
xxaaa
Název: Re: vypsani retezce, jeden radek
Přispěvatel: Nemo7 22 Října 2009, 16:17:10
@ Nemo7 .. tvuj perl vyraz rozhodne nejde pokud tam nejsou jen *stejne znaky v retezci a navic se obavam, ze by fungoval jen na jeden radek ..
Jde, to jsem vyzkoušel, než jsem to sem vlepil :
Kód: [Vybrat]
cat tst.txt
aaaaa sss aaaa bbbb xxxxxx
cccc wwww aaa
aa vvvv hhhhh

> cat tst.txt | perl -ne '@vzor = ($_ =~ /(aa+)/g); foreach (@vzor) {print "$_;"}'
Vypíše : aaaaa;aaaa;aaa;aa;
Jenom je závěrečný středník navíc..  ;)

Pokud upravím na příklad s Xkama, tak funguje také :
Kód: [Vybrat]
> cat tst.txt
sfsdf sf gdhfg hfgh gfh fhf hf hf hfh fh fh fhf xxyyy
drserser gfhgfhfg sadadsad xxccc wewqewr xxaaa frerwrewrwr
> cat tst.txt | perl -ne '@vzor = ($_ =~ /(xx\w+)/g); foreach (@vzor) {print "$_;"}'

Výsledek : xxyyy;xxccc;xxaaa;