Portál AbcLinuxu, 13. května 2025 23:26

Dotaz: sed +promenna

20.3.2011 16:51 thinkdeep
sed +promenna
Přečteno: 773×
Odpovědět | Admin
zdravim, chtel bych se zeptat jestli je nejaka moznost jak si v sedu ulozit nalezeny vzorek a pak ho pouzit napr: mám nejakou vetu: testovaci věta je toto. a nad kazdym radkem souboru mam posloupnost prikazu sed -e "s/blabla/" a v jednu chvili potrebuju najit vzorek věta a nahradit ho napr. světak ...takze světak

je tedy nejak mozne uprostred sedu si vzorek ulozit do promene nb ho primo prenest do prostred vkladane substituce? děkuji

co sem zatim tak zkousel je sed -e "s/promena=....vzorek pro hledani..../....1/2vzorku `$promena` 2/2vzorku.../g"

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.3.2011 17:05 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ten popis je dost zmatený, ale patrně vám jde o zpětnou referenci. V tomto nejjednodušším případě

  sed -e 's/regex/s&k/'
20.3.2011 17:22 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
presne tohle jsem mel na mysli, mockrat dekuju :)) nejjednodussi reseni byvaji nejlepsi :D jeste jednou dik
20.3.2011 18:22 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

a muzu se jeste zeptat kdyz mam haldu vnitrnich prikazu -e jestli to muzu nejak psat na vice radku a ne na jeden za sebou...

prípadne jestli kdyz spustim sed -e ....-e .... s explicitnim netisknutim a na dalsi radek dalsi sed -e se zbylými prikazy, tak bude ten druhej sed provadet upravy na puvodnim souboru, nebo uz na tom predspracovanym?

Díky za odpoved
20.3.2011 18:34 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

1. Continuation line (to je záležitost shellu, ne sedu):

  sed -e '...' \
    -e '...' \
    -e '...'

2. Jestli myslíte

  ... | sed -e '...' | sed -e '...'

tak tam druhý sed pochopitelně zpracovává až výstup toho prvního (nic jiného ani nedostane).

20.3.2011 19:59 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
no pouzil jsem obe varianty :))

ted me vrta hlavou jak regularnim vyrazem popsat smesici velkych pismen, cisel a podtrzitka napr ASV_4R OC4X RT_W apod. nejak mi sed nechce brat [:upper:]
20.3.2011 20:07 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

[[:upper:][:digit:]_]+

Tedy alespoň pro extended regular expressions (u GNU sedu přepínač -r). Pro basic regular expressions by mělo stačit dát před plus backslash, ale stoprocentně jistý si nejsem.

20.3.2011 20:35 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

potrebuju aby to bylo co nejvic prenositelny, ale i tak to [[:upper:][:digit:]_]+ nefunguje..ani s -r a ani s \+

:(:( ale jestli jsem dobre pochopil syntaxi tak by mozna slo [[A-Z][0-9]_]\+ nebo se pletu?
20.3.2011 21:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Spíš [A-Z0-9_]\+
21.3.2011 07:31 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
A ověřit že je v locales nějaké rozumné řazení, tuhle se tu zrovna někdo divil.
LC_COLLATE=C sed ...
Možná když jde o tu přenositelnost tak nějaký starší sed by to mohl brát z LANG či LC_ALL, nevím.
21.3.2011 08:40 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

jo tohle dost pomohlo, porad mam problem ze ikdyz pouziji

LC_COLLATE=C sed -e "s/[A-Z0-9_]\{2,\}/bla bla & bla bla/g"

tak mi to krome smyslenych vzorku typu ASV_4R OC4X RT_W najde i posloupnosti cisel..coz nechci

kazda rada draha :))
21.3.2011 08:53 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
V tom případě budete muset upřesnit, co chcete. Požadavku "smesici velkych pismen, cisel a podtrzitka" totiž vyhovuje i posloupnost číslic. Např. pokud by požadavkem bylo, aby nezačínala číslicí (obvyklé u identifikátorů), stačilo by '[A-Z_][A-Z0-9_]*'
21.3.2011 09:11 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Asi jsem se spatne vyjadril :)

Tedy jedna se mi o konstanty, tudiz predpokladejme ze zadna nezacina cislem

napriklad NULL ...posloupnost velkych pismen

nebo ARCH_SET_FS ...kombinace s podtrzitky

pripadne s cisly ...ale ted me tak napada nejsem si jistej jestli sou tam i dvojciferny cisla ...ale to neresi to ze mi to vybira i cisla uplne jiny .... ale mozna by to slo resit tim ze bych to rozepsal -> dá se v sedu v regularnim vyrazu psat nebo?? jako svislice? ze bych napsat s/[A-Z_]\{2,\} | [A-Z_]\+[0-9] atd...
21.3.2011 09:28 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Tedy jedna se mi o konstanty, tudiz predpokladejme ze zadna nezacina cislem

V tom případě máte řešení v minulém příspěvku. Pokud chcete napsat něco jiného, budete muset napsat co. Nejsme jasnovidci, abychom poznali, co asi tak můžete chtít, když to nenapíšete.

dá se v sedu v regularnim vyrazu psat nebo?? jako svislice?

Co si takhle přečíst specifikaci?

21.3.2011 09:50 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

V tom případě máte řešení v minulém příspěvku.

omlouvam se prehlidl jsem ... po uprave na [A-Z_][A-Z0-9_]\{2,\} to snad pojme vsechny varianty :)

Co si takhle přečíst specifikaci?

specifikaci? zkousel jsem to hledat v manualu ale bez zdarneho vysledku O=)
21.3.2011 10:22 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

mohl bych se jeste zeptat v pripade te zpetne reference &, jde pouzit jen cast?

dejme tomu ze mam nejaky vzorek ale potrebuju z nej pouzit jen cast, napriklad bez prvniho, resp. posledniho znaku (poctu znaku) ...na príkladu světak z toho potrebuju dostat jen věta, nebo spis prakticky nahradit s a k jinymi znaky(retezci)

snad je srozumitelne co potrebuji :)

21.3.2011 10:26 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Ano, lze. Ale už mne nebaví převypravovat vám tady návody, které jste líný si přečíst sám.
21.3.2011 12:01 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

hmm... mozna na tom neco je, ale at hledam jak hledam, stale nenachazim :-( jediny co me napadlo je konstrikce:

sed -e "s/regex/neco neco ${&%(} neco neco/g"

coz by z nalezeneho vyrazu melo odstrihnout levou kulatou zavorku, ale nejak jsem to nezprovoznil :-(

21.3.2011 12:44 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

A co tohle?

  s/regexp/replacement/
       Attempt  to match regexp against the pattern space.  If success‐
       ful,  replace  that  portion  matched  with  replacement.    The
       replacement may contain the special character & to refer to that
       portion of the pattern space  which  matched,  and  the  special
       escapes  \1  through  \9  to refer to the corresponding matching
       sub-expressions in the regexp.
21.3.2011 14:19 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
to jsem zkousel ale nejak mi to nefunguje jak ma :( pokud mam sed -r "s/ (([a-z][a-z0-9_]*)\()/ neco \2 neco /g" tak mi to sice najde spravne slovo zacinajici m. pismenem a obsahujici m. pismena,cisla a "_" a koncici "(", ALE nahradi to tim stejnym vyrazem, coz jestli jsem to pochopil dobre, by melo vznechat tu zavorku "(" pred kterou je "\". uz opravdu nevim
21.3.2011 14:36 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
chyba odhalena :)))
Řešení 1× (thinkdeep (tazatel))
21.3.2011 14:42 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

Mně to funguje správně:

mike@lion:~> sed -r "s/ (([a-z][a-z0-9_]*)\()/ neco \2 neco /g"
f1(a) + f2(b)
f1(a) + neco f2 neco b)

Co to vrátí vám?

21.3.2011 15:46 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

jj, tohle mi uz taky funguje, nevsiml jsem si ze v replacement se odkazuji dvakrat a po vsech zkouskach sem jednou nahradil jako \2 ale jedou jsem tam zapomnel & ...

ted me spis dojimá v

LC_NUMERIC=C sed -e "s/[[:digit:]][,)]/ neco & neco /g"

coz by ve vstupnim textu melo najit cislo nasledovane carkou nebo zavorkou, coz se taky deje, JENZE kdyz mam treba 0) 0, -1, tak mi to u tý -1 neoznaci tu carku...
21.3.2011 15:59 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

jo jasne -r :))

neni jeste nejaky jednoduchy zpusob jak vypreparovat prave ten rozdil mezi \1 a \2 ?
21.3.2011 16:02 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

Na tohle LC_NUMERIC mít vliv nebude, rozlišování tříd znaků se děje podle LC_CTYPE.

Mimochodem, když vidím, co provádíte, nechcete se rovnou podívat na (f)lex?

21.3.2011 16:38 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
No flex neni vsude... navic uz mam vetsinu udelanou sedem... a to s tou -1 a 0, resp. "," a ")" jsem vyresil rozdelenim do dvou prikazu... (ale mozna se na ten flex jeste kouknu)
21.3.2011 16:59 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Problém s -1 je hlavně v tom, že to není '[[:digit:]]' (ani '[[:digit:]]+'). To byste musel použít '-?[[:digit:]]+'.
21.3.2011 17:17 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
no mě to tu -1 najde bez problemu, ten se zacne vyskytovat teprve az v kombinaci s 0 za nimiz potrebuju oddelit carku nebo zavorku, ale ktere ke spravnemu nalezeni musim uvest ve vzorku regex ... je to zamotany...nakonec sem to nejak rozkouskoval a uvidim nakolik to bude prenositelny a funkcni na ruznych vstupech :-)
21.3.2011 17:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
A co se (f)lexu týká, tak ten generuje C zdroják, takže na cílovém stroji (kde se to bude spouštět) ho nepotřebujete.
21.3.2011 17:19 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
dokonce tak...no ja potrebuju aby to fungovalo ve skriptu..tak flex necham na jindy :) ale díky moc
21.3.2011 12:07 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
V manuálu sedu si zjistěte jak se přepínají základní a rozšířené regulární výrazy, což bude pro začátek stačit.

Pro to co potřebujete hledejte (jinde) informace o regulárních výrazech, často označovaných zkratkou regexp (regular expression). Existují specifikace, návody, tutoriály, online testovací nástroje...

Také se zajímejte o drobné nuance specifické pro sed.
21.3.2011 08:50 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Správně by to mělo být tak, že při '[[:upper:]]' se uplatní LC_CTYPE a při '[A-Z]' LC_COLLATE. LC_ALL je ale samozřejmě jistota.
22.3.2011 13:51 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Mohl bych mit jeste otazecku? Pokud mam v promene rekneme $2 (nactene z prikazove radky) a chtel bych podle teto promene najit nejaky radek..nad nimz ale provest uplne jinou substituci, ..staci na to jeden sed? mam na mysli neco jako sed -e "najdi radek s $2" pak pokracuj substituci -e "s/neco/neco/1" nebo tohle neni mozne? dekuji.
Řešení 1× (thinkdeep (tazatel))
22.3.2011 14:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

Teď mi není jasné, co úplně přesně chcete, ale jestli jde o to, aby se substituce provedla jen na řádcích obsahujících vzorek $2, tak

  sed -e "/$2/ s/pattern/replacement/"

Ale je potřeba ošetřit situaci, kdy by $2 obsahoval lomítko. Jestli jsem něco nepřehlédl, v bashi by mohlo stačit

  sed -e "/${2//\//\\/}/ s/pattern/replacement/g"
22.3.2011 14:39 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Jo presne tohle jsem mel na mysli.

No vyskyt lomitka resit nemusim, to tam urcite nebude, ale i tak pri pouziti

sed -e "/$2/ s/pattern/replacement/" tohle hlasí syntaktickou chybu a v prípade ..$2 /s/... to oznaci a nahradi i radky bez vzorku $2..
22.3.2011 14:42 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Jakou syntaktickou chybu? Nesmíte zapomínat, že i v tomto případě se vzorek (oba vzorky) pořád chápe jako regulární výraz.
22.3.2011 15:53 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna

jo, to chapu, ale kdyz mam:

ahoj ahoj ahoj cau ahoj nazdar

ahoj ahoj ahoj cau ahoj cau

a sed -e "/$2/ s/pattern/replacement/ kde $2 je nazdar, pattern je cau, a replacement je taky ahoj

tudiz sed -e "/nazdar/ s/cau/ahoj/g" by mi melo vstup predelat na:

ahoj ahoj ahoj ahoj ahoj nazdar

ahoj ahoj ahoj cau ahoj cau

problem je v tom ze vsechny "cau" tedy pattern jsou zmeneny na replacement, bez ohledu na vyskyt toho $2

tak nevim kde je chyba :-(

22.3.2011 16:36 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna

Z toho, co píšete (a hlavně co nepíšete0, těžko hádat, kde děláte chybu, ale prostě to funguje:

mike@lion:~> sed -e "/nazdar/ s/cau/ahoj/" <<EOT
ahoj ahoj ahoj cau ahoj nazdar
> ahoj ahoj ahoj cau ahoj cau
> EOT
ahoj ahoj ahoj ahoj ahoj nazdar
ahoj ahoj ahoj cau ahoj cau

Hint: příště nepište "ono to nefunguje", ale raději zcela konkrétně napište, co jste zkusil, jak to dopadlo a případně jak si myslíte, že to mělo dopadnout.

23.3.2011 10:11 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
No je to nejaky divny. Asi mi nejak stagnuje linux(ubuntu-navirtualizovany)nebo co, nejak me to nechce poslouchat...,jinak tenhle priklad mi fakt nejede ani spustenej z prikazovy radky, hodi mi to nejakou chybu syntaxe zase. Ale zkusil jsem to na FreeBSD a tam to jede jak ma, máte pravdu.

Nic mene ted se mi to uplne slozilo a ani ten skript nemuzu rozjet :-( pise mi to bash: ./skript.sh: /bin/bash^M: chybny interpretr: Adresar nebo soubor neexistuje

a ikdyz zmenim bash za sh, tak nechapu kde se tam bere ^M
23.3.2011 10:48 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Používáte editor, který jako oddělovač používá CRLF (jak je zvykem v DOSu a Windows) místo samotného LF (jak je zvykem v unixových systémech). Většinou je to jedno, ale u skriptů to vadí. Podívejte se, jestli máte v systému utilitku unix2dos, a pokud ano, použijte ji.
Řešení 1× (thinkdeep (tazatel))
23.3.2011 10:50 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
To ^M je CR, Wndows používají jako oddělovač řádků CRLF, linux jen LF, takže přebytečný CR zlásí jako znak ^M. Interpertr /bin/bashCR pak opravdu neexistuje. Zkuste na soubor aplikovat jeden z příkazů:
dos2unix skript.sh
sed -i -e 's/$/\r/' skript.sh
tr -d \\r < skript.sh > skipt2.sh
Děkuji že jste mě opět obšťastnil hláškou "hodi mi to nejakou chybu syntaxe zase", ale hlavně že vám to teda alespoň na FreeBSD funguje.
23.3.2011 11:05 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Jo to me nenapadlo,...sice sem to cely psal v linuxu, ale tim se to bylo ve sdileny slozce s win, a tim ze sem si to musel poslat misto namountovat se to asi prepsalo...
dos2unix skript.sh
tohle funguje

a to s tim

Děkuji že jste mě opět obšťastnil hláškou "hodi mi to nejakou chybu syntaxe zase", ale hlavně že vám to teda alespoň na FreeBSD funguje.
na to sem odpovidal na konci

dnes 10:23 thinkdeep Re: sed +promenna Odpovědět | Označit jako řešení | Sbalit | Výše | Link | Blokovat | Admin

Chapu, chapu...ten problem sem preskocil kdyz mi to jede na jinym stroji, kdezto tady ne. tedy: sed: -e vyraz c.1, znak 2: nadbytecne znaky po prikazu dulezitejsi, je proc nemuzu spustit ten skript vubec, ...to je tak kdyz aktualizuju system aniz by to bylo potreba :/ uz mi nejdou ani namountovat slozky

23.3.2011 11:21 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
Oprava, sed měl být:
sed -i -e "s/\r//" skript.sh
to výše uvedené dělá přesný opak :)
23.3.2011 06:05 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
Napadá mne jen možnost že $2 neobsahuje "nazdar", ale je prázdné, přestože si třeba myslíte opak. Potom by sed použil nahrazení na všechny řádky.

Bude lepí když vždy pošlete výpis z terminálu co vám to udělalo a komentář co to dělat mělo, pokud je to možné. Tyhle slovní popisy toho co děláte jsou dost náchylné k chybné interpretaci a často je copy&paste z terminálu i rychlejší.
23.3.2011 06:13 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
tohle hlasí syntaktickou chybu

To je jako když blondýna řekne "auto nestartuje" ale už neřekne, že na palubním počítači je nápis "nedostatek paliva".

Napsat JAKOU syntaktickou chybu to hlásí je zcela zásadní, nenapsat je naopak neodpustitelný hřích ;)
23.3.2011 10:23 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Chapu, chapu...ten problem sem preskocil kdyz mi to jede na jinym stroji, kdezto tady ne. tedy: sed: -e vyraz c.1, znak 2: nadbytecne znaky po prikazu

dulezitejsi, je proc nemuzu spustit ten skript vubec, ...to je tak kdyz aktualizuju system aniz by to bylo potreba :/ uz mi nejdou ani namountovat slozky

23.3.2011 11:10 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
Už jsem ztratil nit čeho se to týkalo, ale pokud je to něco jako:
echo $dva
nazdar
bash$ LC_MESSAGES=C sed -e "/$dva/ s/cau/ahoj/" <<EOT
ahoj ahoj ahoj cau ahoj nazdar
ahoj ahoj ahoj cau ahoj cau
EOT
sed: -e expression #1, char 2: extra characters after command
a zkoušel jste to v nějakém skriptu a ne přímo v příkazové řádce, tak to může souviset s těmi nadbytečnými CR, pokud se tam na koncích řádků motají. Příklad je jen ilustrativní, reálně mi to žádnou chybu nehází.
23.3.2011 11:19 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
BOZE :D zrejme v LC_MESSAGES=C byl zakopan pes :)) jeste to zkusim v tom skriptu :)
23.3.2011 11:22 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
To asi ne, to jen mění jazyk ve kterém vám sed bude vypisovat chybové hlášky. Většina lidí na ty české není zvyklá a tak jim buď moc nerozumí, nebo nechce rozumět :)
23.3.2011 12:18 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Spíš bych tipoval, že kolega (ne)použil LC_MESSAGES=C na ten příkaz, jehož výstup pak parsoval sedem.
23.3.2011 12:49 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Ahaa...koukam uz vim proc se mi to jednou podarilo :))

Problem je trosku jinde...kdyz zadam to natvrdo co chci hledat, tedy nazdar, tak mi to najde, ale kdyz pomoci promene $2, tak uz ne...

a promenou sem si nechal vypsat, takze vim, ze v ni je to co potrebuji...takze kdyz tam necham promenou vypisuje mi sed(ve skriptu):

-e expression #1, char 0: no previous regular expression

resp. sed: -e vyraz c. 1, znak 0: zadny predchazejici regularni vyraz

ale(mimo skript)

thinkdeep@ThinkDeepers:~$ echo $promena

nazdar

thinkdeep@ThinkDeepers:~$ LC_MESSAGES=C sed -e "/$promena/ s/cau/ahoj/" << baf

> ahoj ahoj ahoj cau ahoj nazdar

> ahoj ahoj ahoj cau ahoj cau

> baf

ahoj ahoj ahoj ahoj ahoj nazdar

ahoj ahoj ahoj cau ahoj cau

23.3.2011 12:51 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Takhle se asi nikam nedostaneme… zkuste sem dát jako přílohu ten skript, který vám nefunguje.
Řešení 1× (thinkdeep (tazatel))
23.3.2011 13:04 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
To je zase jiná hláška, tu umím taky :)
bash$ sed -e "// s/cau/ahoj/" <<EOT
ahoj ahoj ahoj cau ahoj nazdar
ahoj ahoj ahoj cau ahoj cau
EOT

sed: -e expression #1, char 0: no previous regular expression
nebylo by možné, že v té proměnné přecejen nic není (je prázdná)? Nemáte ten sed třeba v nějaké funkci? Ta má vlastní lokální číselné proměnné, nepřebírá ty globální...
23.3.2011 13:41 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Smekám :)) genius :D fakt ze jo, tohle jsem nevedel, myslel jsem ze je to pro cely skript jednotny...

vse funguje jak ma :) tedy na mim linuxu, ted to pujdu testovat na FreeBSD ..takze si moc nefandim :D

btw. je mi trochu zahadou jak se mohli soubory vytvorene v linuxu(ukladane do win) prepsat i pres to ze nebyli pod win otevreny, ale uz si to budu pamatovat pro priste :))
23.3.2011 13:46 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed +promenna
Jen pro upřesnění: $2 není proměnná, ale poziční parametr. Proměnné sdílí funkce se zbytkem skriptu, pokud nejsou explicitně deklarovány jako lokální (pomocí local). Oproti tomu poziční parametry ve funkci reprezentují parametry, se kterými byla volána funkce, ne parametry, se kterými byl volán skript.
26.3.2011 10:36 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
Vím, ze je to trosku off-topic, ale mam problem s porad s tim skriptem...

pod linuxem/centOS mi to jede v poradku, ale pod FreeBSD mi to dela psí kusy :-/

uresneni problemu: prochazi i funkce, ktere by podle switche nemel prochazet

FreeBSD

eva ~/.../...> ./hltrace.sh -h  #toto by melo vypisovat napovedu
+ getopt -o hs: -n hltrace -- -h   #zpracovani parametru
+ TEMP=' -- hs: -n hltrace -- -h'
+ [ 0 != 0 ]
+ eval set -- ' -- hs: -n hltrace -- -h'
+ set -- -- hs: -n hltrace -- -h
+ true
+ shift
+ header   #tady uz se to chova divne
+ echo '...'
...
+ #dalsi prikazy uvnitr fce ktera vubec nema byt vykonavana
+ tail
+ echo '...'
...
+ break
eva ~/.../...>

Linux

thinkdeep@ThinkDeepers:~/..$ ./hltrace.sh -h
+ ./hltrace.sh -h
+ getopt -o hs: -n hltrace -- -h
+ TEMP= -h --
+ [ 0 != 0 ]
+ eval set --  -h --
+ set -- -h --
+ true
+ echo    #spravna funkce
...vypis napovedy..
thinkdeep@ThinkDeepers:~/..$
 

Skript>
#!/bin/sh
set -x
TEMP=`getopt -o hs: \-n 'hltrace' -- "$@"`
        
if [ $? != 0 ] ; then echo "Use   ./hltrace.sh -h   for usage" >&2 ; exit 1 ; fi
eval set -- "$TEMP"
header () {....}
..dalsi funkce...
while true ; do
        case "$1" in
                -h|-H) echo "napoveda..." ; shift ; break ;;
                -s|-S) header ; promena="$2" ; fce... ; shift 2 ; break ;;
                --) shift ; header ; fce ; tail ; break ;;
                *) exit 1 ;;
        esac
done

nejaky napad?

26.3.2011 10:55 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
První rozdíl je v hodnotě TEMP, v linuxu to do TEMP přiřadi výsledek volání getopt, ve FreeBSD to vypadá, že jen ten řetězec. Prověřte co je doopravdy přiřazeno v TEMP, správné fungování fce getopt a funkci zpětných apostrofů (`) (zvažte přejít na POSIX kompatibilní formu $(...) místo starší `...`).
26.3.2011 11:41 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
hm, hm..

skript1

TEMP=`getopt -o hs: \-n 'hltrace' -- "$@"`
if [ $? != 0 ] ; then echo "Use   ./hltrace.sh -h   for usage" >&2 ; exit 1 ; fi
echo "$TEMP" ; exit 1 ;

vystup FreeBSD

eva ~/..> ./hltrace.sh -h
+ getopt -o hs: -n hltrace -- -h
+ TEMP=' -- hs: -n hltrace -- -h'
+ [ 0 != 0 ]
+ echo ' -- hs: -n hltrace -- -h'
 -- hs: -n hltrace -- -h
+ exit 1
eva ~/..>

vystup Linux

+ ./hltrace.sh -h
+ getopt -o hs: -n hltrace -- -h
+ TEMP= -h --
+ [ 0 != 0 ]
+ echo  -h --
 -h --
+ exit 1

opravdu se tedy obsah promene lisi, ale pokud pouziji co jste psal (tedy jestli jsem to spravne pochopil)

TEMP=$(getopt -o hs: \-n 'hltrace' -- "$@")

tak

+ getopt -o hs: -n hltrace -- -h
+ TEMP=' -- hs: -n hltrace -- -h'
+ [ 0 != 0 ]
+ echo ' -- hs: -n hltrace -- -h'
 -- hs: -n hltrace -- -h
+ exit 1

tak je vystup obdobny se mi zna
26.3.2011 14:21 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed +promenna
Tak já příště zdůrazním, že analýza problému má probíhat v pořadí, v jakém ty body uvádím tedy TEMP, getopt, $() nakonec :)
27.3.2011 09:19 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
To sem ted nejak nepochopil O=)
26.3.2011 13:50 thinkdeep
Rozbalit Rozbalit vše Re: sed +promenna
nakonec sem to vyresil pomoci getopts :) a funguje to jak na linuxu tak na FreBSD :))

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.