Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Miloš 21. 09. 2011, 11:04:55

Název: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:04:55
Jak nejlépe získat z řádky (bude nalezena přes grep), řetězec následující po /texty/:

příklady:
blablabla /texty/finance blablabla
blabla /texty/ano blablabla
blablablabla /texty/jo blabla
blablabla /texty/asi  ... tento pripad (po retezci je uz konec) asi nastane
bla /texty/dnes blabla

po tom řetězci, který mne zajímá, by měla být vždy mezera, ale také už může být konec celého textu
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:13:21
zapomnel jsem - jestli mi nekdo poradi - tak pokud mozno pomoci nejjednodussich prikazu . muj shell je dost primitivni
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: and 21. 09. 2011, 11:18:10
| awk -F "/" '{print $1}'|awk '{print $1}

... nebo tak nejak ;) Ale neni to v "shellu"  8)
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: DgBd 21. 09. 2011, 11:26:04
| awk -F "/" '{print $1}'|awk '{print $1}

... nebo tak nejak ;) Ale neni to v "shellu"  8)

| sed -e 's/.*texty\(.*\)/\1'
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: DgBd 21. 09. 2011, 11:28:11
| sed -e 's/.*texty\/\(.*\)/\1/'
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: pepazdepa 21. 09. 2011, 11:31:31
Jak nejlépe získat z řádky (bude nalezena přes grep), řetězec následující po /texty/:

příklady:
blablabla /texty/finance blablabla
blabla /texty/ano blablabla
blablablabla /texty/jo blabla
blablabla /texty/asi  ... tento pripad (po retezci je uz konec) asi nastane
bla /texty/dnes blabla

po tom řetězci, který mne zajímá, by měla být vždy mezera, ale také už může být konec celého textu

while read line ; do line=${line##*/}; line=${line%% *}; echo "vysledek: $line" ; done < vstupni_soubor

Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:32:47
| sed -e 's/.*texty\/\(.*\)/\1/'

dik, tohle najde ten retezec, ale jeste to zachova vse za nim. Da se to nejak lidsky pochopit, co je v tom prikazu vubec napsano ? :-)
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:35:39
Jak nejlépe získat z řádky (bude nalezena přes grep), řetězec následující po /texty/:

příklady:
blablabla /texty/finance blablabla
blabla /texty/ano blablabla
blablablabla /texty/jo blabla
blablabla /texty/asi  ... tento pripad (po retezci je uz konec) asi nastane
bla /texty/dnes blabla

po tom řetězci, který mne zajímá, by měla být vždy mezera, ale také už může být konec celého textu

while read line ; do line=${line##*/}; line=${line%% *}; echo "vysledek: $line" ; done < vstupni_soubor

dik, tohle byl priklad, nepotrebuju cist vsechny radky ze souboru. Ja najdu pomoci grep prislusny zapis a potrebuji ziskat jen to jedno slovo
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: pepazdepa 21. 09. 2011, 11:40:50
Citace

while read line ; do line=${line##*/}; line=${line%% *}; echo "vysledek: $line" ; done < vstupni_soubor

dik, tohle byl priklad, nepotrebuju cist vsechny radky ze souboru. Ja najdu pomoci grep prislusny zapis a potrebuji ziskat jen to jedno slovo

tak si vstup prozen grepem pred while a mas to ne?
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:50:07
Citace

while read line ; do line=${line##*/}; line=${line%% *}; echo "vysledek: $line" ; done < vstupni_soubor

dik, tohle byl priklad, nepotrebuju cist vsechny radky ze souboru. Ja najdu pomoci grep prislusny zapis a potrebuji ziskat jen to jedno slovo

tak si vstup prozen grepem pred while a mas to ne?

ale v tom textu blablablabla muze klidne byt: /text1/text2 a tohle najde prave to prvni
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: deadmail 21. 09. 2011, 11:54:12
Kód: [Vybrat]
sed -n '/^.*\/texty\//{s///;s/ .*$//;p}'alebo
Kód: [Vybrat]
sed -nr '/\/texty\//{s_^.*/texty/([^ ]+).*$_\1_;p}'
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: Miloš 21. 09. 2011, 11:59:10
Kód: [Vybrat]
sed -n '/^.*\/texty\//{s///;s/ .*$//;p}'alebo
Kód: [Vybrat]
sed -nr '/\/texty\//{s_^.*/texty/([^ ]+).*$_\1_;p}'

dik moc, hned to prvni funguje. Akorat mi to nic nerika :-)
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: DgBd 21. 09. 2011, 12:08:09
Kód: [Vybrat]
sed -n '/^.*\/texty\//{s///;s/ .*$//;p}'alebo
Kód: [Vybrat]
sed -nr '/\/texty\//{s_^.*/texty/([^ ]+).*$_\1_;p}'

dik moc, hned to prvni funguje. Akorat mi to nic nerika :-)

tak to je fakt soda :-)

já mám:

|  sed -e 's/.*texty\/\(\w*\)\b.*/\1/'

to je možná srozumitelnější
matchuj cokoliv až po texty/, zapamatuj si slovo jako 1, matchuj hranici slova, matchuj cokoliv
vytiskni 1
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: deadmail 21. 09. 2011, 12:13:43
to je možná srozumitelnější
matchuj cokoliv až po texty/, zapamatuj si slovo jako 1, matchuj hranici slova, matchuj cokoliv
vytiskni 1

Zavisi od toho co tam moze byt ... slovo len z pismen a cisel (vase riesenie s \w, dokonca akceptuje aj prazdne slovo), alebo cokolvek okrem medzery (moje riesenia).
Moje riesenie navyse nevypise nic, ak riadok neobsahuje /texty/
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: DgBd 21. 09. 2011, 12:16:46
to je možná srozumitelnější
matchuj cokoliv až po texty/, zapamatuj si slovo jako 1, matchuj hranici slova, matchuj cokoliv
vytiskni 1

Zavisi od toho co tam moze byt ... slovo len z pismen a cisel (vase riesenie s \w, dokonca akceptuje aj prazdne slovo), alebo cokolvek okrem medzery (moje riesenia).
Moje riesenie navyse nevypise nic, ak riadok neobsahuje /texty/

tak to by mělo být ošetřeno už tím grepem (nebo naopak může ten grep úplně nahradit).

Ale jinak hluboce smekám, takové použití jsem ještě v životě neviděl.
Název: Re: Vyhledání řetězce v shell scriptu
Přispěvatel: pepazdepa 21. 09. 2011, 12:19:15
|  sed -e 's/.*texty\/\(\w*\)\b.*/\1/'

to je možná srozumitelnější
matchuj cokoliv až po texty/, zapamatuj si slovo jako 1, matchuj hranici slova, matchuj cokoliv
vytiskni 1

perlova syntaxe v sedu neni prenositelna, ne kazdy sed je GNU sed.

$ echo '/text/text /texty/finance /text/text' | sed 's/^.*\/texty\/\([^ ]*\).*$/\1/'
finance
$ echo '/text/text /texty/finance /text/text' | perl -pe 's#^.*/texty/(\S+).*$#$1#;'
finance