Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.

Autor Téma: vypsani retezce, jeden radek  (Přečteno 1901 krát)

Uran

  • Člen
  • **
  • Příspěvků: 341
    • Zobrazit profil
vypsani retezce, jeden radek
« kdy: 16 Říjen 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.
"Pouze text v MS Wordu je opravdu čistý, příteli."

premet

  • Host
Re: vypsani retezce, jeden radek
« Odpověď #1 kdy: 16 Říjen 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
« Poslední změna: 16 Říjen 2009, 21:26:47 od Kotrmelec »

Uran

  • Člen
  • **
  • Příspěvků: 341
    • Zobrazit profil
Re: vypsani retezce, jeden radek
« Odpověď #2 kdy: 16 Říjen 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.
"Pouze text v MS Wordu je opravdu čistý, příteli."

arrange

  • Závislák
  • ****
  • Příspěvků: 4031
  • "jdu s hlavou vztyčenou..."
    • Zobrazit profil
Re: vypsani retezce, jeden radek
« Odpověď #3 kdy: 16 Říjen 2009, 21:58:07 »
Takhle nějak?
grep -o <řetězec_k_hledání> <soubor>
http://www.openstreetmap.org - mapy celého světa "wiki style"

LuciusMare

  • Závislák
  • ****
  • Příspěvků: 1749
    • Zobrazit profil
Re: vypsani retezce, jeden radek
« Odpověď #4 kdy: 16 Říjen 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 :)
Citace
<Firzen> tak teď budu Číňan
<Firzen> tak uvidíme :D
Jabber: LuciusMare (zkroucenina) jabbim (tecka) cz

Nemo7

  • Člen
  • **
  • Příspěvků: 160
    • Zobrazit profil
Re: vypsani retezce, jeden radek
« Odpověď #5 kdy: 20 Říjen 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.

« Poslední změna: 20 Říjen 2009, 12:44:26 od Nemo7 »

nettezzaumana

  • Host
Re: vypsani retezce, jeden radek
« Odpověď #6 kdy: 22 Říjen 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

Nemo7

  • Člen
  • **
  • Příspěvků: 160
    • Zobrazit profil
Re: vypsani retezce, jeden radek
« Odpověď #7 kdy: 22 Říjen 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;