abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    včera 22:00 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 13:55 | Komunita

    Na itch.io probíhá Linux Game Jam 2023. Zapojit se a přihlásit hru běžící na Linuxu lze do 6. června do 01:59. Zahrát si lze hry z loňského ročníku.

    Ladislav Hagara | Komentářů: 2
    27.5. 18:55 | IT novinky

    Na Steamu lze získat zdarma počítačové hry Warhammer 40,000: Gladius - Relics of War a Hue. Na Epic Games Storu počítačovou hru Fallout: New Vegas - Ultimate Edition.

    Ladislav Hagara | Komentářů: 8
    26.5. 08:00 | Komunita

    WordPress (Wikipedie), open source systém pro správu webového obsahu (CMS), zítra slaví 20 let. První verze byla vydána 27. května 2003.

    Ladislav Hagara | Komentářů: 26
    25.5. 21:44 | Nová verze

    Deno (Wikipedie), běhové prostředí (runtime) pro JavaScript, TypeScript a WebAssembly, bylo vydáno ve verzi 1.34. Přehled novinek v poznámkách k vydání. Od verze 1.6 lze pomocí "deno compile" sestavit ze zdrojových kódů binární spustitelný soubor. Nově "deno compile" podporuje také npm balíčky.

    Ladislav Hagara | Komentářů: 7
    25.5. 20:22 | Komunita

    Aktuálně posledním 14. open source filmem od Blender Studia je CHARGE (YouTube). Dokončuje se 15. film Pet Projects. Začíná se pracovat na 16. filmu s pracovním názvem Project Gold.

    Ladislav Hagara | Komentářů: 6
    25.5. 13:33 | Komunita

    Thunderbird má nové logo.

    Ladislav Hagara | Komentářů: 32
    24.5. 21:44 | Komunita

    Není zcela jednoduché rozchodit v Linuxu kameru IPU6 umístěnou v noteboocích Dell Latitude 9420, Lenovo ThinkPad X1 Carbon Gen 10, Lenovo ThinkPad X1 Nano Gen 2, Lenovo ThinkPad X1 Yoga Gen 7 a dalších. Ve Fedora Linuxu je to teď snadnější. Hans de Goede informuje o podpoře kamery IPU6 ve Fedora Linuxu pomocí balíčků umístěných na RPM Fusion.

    Ladislav Hagara | Komentářů: 24
    24.5. 17:33 | IT novinky

    Společnost AMD na YouTube představila a oznámila prodej grafické karty Radeon RX 7600. Cena začíná na 269 dolarech.

    Ladislav Hagara | Komentářů: 0
    24.5. 12:11 | Nová verze

    Podman Desktop dospěl do verze 1.0. Jedná se o grafickou nadstavbu nad nástrojem Podman, jenž umožňuje vytvářet a provozovat kontejnery, aniž by uživatel potřeboval práva roota.

    Ladislav Hagara | Komentářů: 0
    Obnovovací frekvenci obrazovky (LCD) preferuji
     (71%)
     (22%)
     (5%)
     (2%)
    Celkem 706 hlasů
     Komentářů: 13, poslední 25.5. 07:25
    Rozcestník

    Dotaz: BASH | Rozdělení stringu

    31.7.2012 17:03 Petr
    BASH | Rozdělení stringu
    Přečteno: 832×
    Ahoj, mám proměnou ve které je text oddělený znakem | a potřebuji je rozdělit do dvou proměnných do první proměnné uložit to co je před znakem | a do druhé to co je za znakem |. Poradí prosím nějaký frajer? ;-) Moc moc děkuji!
    TEXT="/etc/apache2/host|/tmp/apache2/host"

    Řešení dotazu:


    Odpovědi

    mess avatar 31.7.2012 17:08 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Třeba tady.
    Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
    31.7.2012 17:11 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu

    ${TEXT%|*} a ${TEXT#*|}

    Případně obecněji pro libovolný počet částí: IFS='|' toks=($TEXT); echo "${toks[0]}, ${toks[1]}, ..." (mezi nastavením IFS a přiřazením poli nemá být ani konec řádku, ani středník, aby se po přiřazení zachovalo původní IFS).

    31.7.2012 17:15 Petr
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Tak to jste opravdu dobrej, smekám.. a dal by jste i tři?
    TEXT="/etc/apache2/host|/tmp/apache2/host|/var/apache2/host"
    31.7.2012 17:18 l4m4
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Stačí si přečíst tu část odpovědi s ,libovolný počet částí`.
    31.7.2012 17:31 Petr
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Hm, tak buď to nechápu nebo mi to nejde z jiného důvodu, vypisuje se pořád všechno :(
         IFS="|"
         for READ in $(cat /tmp/data.txt)
         do
              TOKS=($READ)
              ${TOKS[0]}
              ${TOKS[1]}
              ${TOKS[2]}
         done
    31.7.2012 17:48 l4m4
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Nevím, co máš přesně v /tmp/data.txt, ale IFS patří do toho přiřazení. Např.:
    while read x; do IFS=: y=($x); echo ${y[4]}; done </etc/passwd
    4.8.2012 18:03 trish
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu

    mezi nastavením IFS a přiřazením poli nemá být ani konec řádku, ani středník, aby se po přiřazení zachovalo původní IFS.

    Rejp, tohle neplatí, nezachová se. Pokud v jednoduchém příkazu není nic jiného než přiřazení (a přesměrování), mění všechna proměnné aktuálního shellu (viz man bash, Simple Command Expansion). (Pokud je, nezmění se žádná z nich.)

    I další doteď uvedené příklady změní IFS shellu, což si lze snadno ověřit skrze: set|grep IFS, příp. povšimnout si na jaká slova se nadále expanduje proměnná TEXT: kupř. pomocí echo $TEXT "$TEXT" (dělení slov dle $IFS není totéž a tehdy, kdy se rozpoznávají jednotlivá slova-tokeny (ty v bashi vždy oddělují znaky: | & ; ( ) < > space tab)).
    4.8.2012 18:29 Kit
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Taj si to vyzkoušej, když nevěříš:
    LANG=POSIX df
    df
    
    První příkaz se vypíše v POSIXu, druhý zase s původní lokalizací.
    4.8.2012 18:47 l4m4
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    On naráží na něco jiného, na konstrukci
    a=b c=d
    což skutečně není globální přiřazení c=d s lokálním nastavením a=b, ale globální přiřazení do c i a. Takže to IFS by se mělo raději nastavovat jinde...
    6.8.2012 05:38 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Taj si to vyzkoušej, když nevěříš:
    TEXT="/etc/apache2/host|/tmp/apache2/host"
    
    echo "Old IFS: $IFS"
    
    IFS='|' toks=($TEXT); echo "${toks[0]}, ${toks[1]}, ..."
    
    echo "New IFS: $IFS"
    
    Old IFS:
    
    /etc/apache2/host, /tmp/apache2/host, ...
    New IFS: |
    
    6.8.2012 17:00 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Jasně, máš pravdu. Díky za komentář, mně to vůbec nedošlo. :-/ Takže zbývá asi jen uložit původní hodnotu a přiřadit zpátky (anebo si být jistý, že změna IFS zbytku scriptu nevadí).
    7.8.2012 01:19 trish
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Nejspíš nevadí, jinak by se tazatel ozval sám. Tedy, doufám. :)

    Ad čisté (prakticky krátké) řešení. Buď jak píšeš anebo skrz funkci:
    moje() { local IFS=\|; toks=($TEXT);}
    
    prirad() { local IFS=$1; eval $2=\(\$$3\);}
    prirad \| toks TEXT
    
    7.8.2012 01:50 trish
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    //a samosebou dřív nebo později prospěje kontrola počtu parametrů:
    prirad() { [ $# -eq 3 ] || return 1; local IFS=$1; eval $2=\(\$$3\);}
    7.8.2012 10:14 trish
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    i když, a zejména vzhledem k výše řečenému (plus bez dalšího procesu, přestože konstrukce [[]] mi jinak není úplně sympatická), by bývalo mělo být:
    prirad() { [[ $# -eq 3 ]] || return 1; IFS=$1 eval $2=\(\$$3\);}

    ráno (někdy i může být) moudřejší večera :)
    9.8.2012 15:02 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Konstrukce [ ] byla v pořádku, náhradou za [[ ]] jste zde nic nezískal. Změnou použití IFS rovněž ne. Čeho jste vlastně chtěl dosáhnout?
    9.8.2012 21:51 trish
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Někde hluboko mám zafixováno, že se u jisté třídy případů [[ a [ chovaly trochu jinak (Nevím už jistě, oč přesně šlo, ani nemám teď sílu pročítat man, je-li tomu tak v něčem teď.) a že (pro mne přátelštější) [ není builtin bashe (což možná vždycky mylně, díky Michalu Kubečkovi za info). Ad druhá připomínka: imho je druhý zápis elegantnější, nic víc. Nač jsi chtěl přijít?
    9.8.2012 23:25 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Mezi [ a [[ je řada rozdílů, obecně lze říct že [ má smysl jen kvůli kompatibilitě, jinak má spíš nevýhody, [[ je jeho modernější náhrada s více možnostmi. No, z nostalgie je mi také někdy [ sympatičtější ;)
    bash$ [ 1 < 2 ] && echo ok
    bash: 2: No such file or directory
    bash$ [ 1 \< 2 ] && echo ok
    ok
    bash$ [[ 1 < 2 ]] && echo ok
    ok
    bash$ a="1 2"
    bash$ [ $a = "1 2" ] && echo ok
    bash: [: too many arguments
    bash$ [ "$a" = "1 2" ] && echo ok
    ok
    bash$ [[ $a == "1 2" ]] && echo ok
    ok
    bash$ [[ "$a" =~ ^[[:digit:]]" "[[:digit:]] ]] && echo ok
    ok
    a=1;b=2
    bash$ [[ $a > 0 && $b == 2 ]] && echo ok
    ok
    bash$ [ "$a" -gt 0 -a "$b" -eq 2 ] && echo ok
    ok
    
    Chtěl jsem přijít na to, proč tak důrazně radikálně trváš na tom, že by se to mělo řešit jinak, když tvé původní řešení bylo dobře a nové řešení nepřineslo žádnou změnu či výhodu.
    9.8.2012 16:54 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Příkaz test (i se synonymem [ ) je v bashi také builtin.
    9.8.2012 15:14 Kit
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    echo "$TEXT" | while IFS='|' read a b c; do
      echo "První část: $a"
      echo "Druhá: $b"
      echo "Zbytek: $c"
    done
    Řešení 1× (trish)
    9.8.2012 18:29 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu

    Což má ale jednu podstatnou nevýhodu, totiž že rozsekané proměnné žijí jen v rámci subprocesu s while. V bashi to nicméně jde pěkně vyřešit pomocí while ... done <<<"$TEXT".

    Jo, a while je pro jeden řádek samozřejmě zbytečné, takže případně prostě IFS='|' read a b c <<<"$TEXT";

    9.8.2012 19:45 Kit
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Zajímavé. Když jsem to zadal ve tvaru
    echo "$TEXT" | while IFS='|' read a b c
    tak to nefungovalo, ale
    IFS='|' read a b c <<<"$TEXT";
    funguje bez problémů. Navíc jsi ušetřil jeden proces, takže to vidím jako skvělé řešení.
    9.8.2012 20:05 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Pokud jde o rozdíl v pipe, tak je to jednoduchý důsledek toho, že příkazy spojené přes pipe se spouští jako samostatné podprocesy, takže veškeré změny prostředí (včetně proměnných) se "ven" nepromítnou.
    9.8.2012 20:11 Kit
    Rozbalit Rozbalit vše Re: BASH | Rozdělení stringu
    Došel jsem ke stejnému závěru. Takže se neušetřil jeden proces, ale dva. Tím lépe a radostněji.

    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.