abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 12:11 | IT novinky

    Digitální a informační agentura (DIA) oznámila (PDF, X a Facebook), že mobilní aplikace Portál občana je ode dneška oficiálně venku.

    Ladislav Hagara | Komentářů: 2
    dnes 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 1
    včera 17:55 | IT novinky

    Společnost Volla Systeme stojící za telefony Volla spustila na Kickstarteru kampaň na podporu tabletu Volla Tablet s Volla OS nebo Ubuntu Touch.

    Ladislav Hagara | Komentářů: 3
    včera 17:44 | IT novinky

    Společnost Boston Dynamics oznámila, že humanoidní hydraulický robot HD Atlas šel do důchodu (YouTube). Nastupuje nová vylepšená elektrická varianta (YouTube).

    Ladislav Hagara | Komentářů: 1
    včera 15:11 | Nová verze

    Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.0.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 4
    včera 14:22 | IT novinky

    Nejvyšší soud podpořil novináře Českého rozhlasu. Nařídil otevřít spor o uchovávání údajů o komunikaci (data retention). Uvedl, že stát odpovídá za porušení práva EU, pokud neprovede řádnou transpozici příslušné směrnice do vnitrostátního práva.

    Ladislav Hagara | Komentářů: 0
    včera 05:33 | Zajímavý článek

    Minulý týden proběhl u CZ.NIC veřejný test aukcí domén. Včera bylo publikováno vyhodnocení a hlavní výstupy tohoto testu.

    Ladislav Hagara | Komentářů: 28
    včera 04:44 | Nová verze

    Byla vydána nová verze 3.5.0 svobodné implementace protokolu RDP (Remote Desktop Protocol) a RDP klienta FreeRDP. Přehled novinek v ChangeLogu. Opraveno bylo 6 bezpečnostních chyb (CVE-2024-32039, CVE-2024-32040, CVE-2024-32041, CVE-2024-32458, CVE-2024-32459 a CVE-2024-32460).

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    Google Chrome 124 byl prohlášen za stabilní. Nejnovější stabilní verze 124.0.6367.60 přináší řadu oprav a vylepšení (YouTube). Podrobný přehled v poznámkách k vydání. Opraveno bylo 22 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 02:22 | Nová verze

    Byla vydána nová verze 9.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Novinkou je vlastní repozitář DietPi APT.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (66%)
     (11%)
     (2%)
     (21%)
    Celkem 521 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: sed +promenna

    20.3.2011 16:51 thinkdeep
    sed +promenna
    Přečteno: 747×
    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:


    Odpovědi

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

    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   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.