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í
×
    dnes 12:55 | Nová verze

    CiviCRM (Wikipedie) bylo vydáno v nové verzi 6.14.0. Podrobnosti o nových funkcích a opravách najdete na release stránce. CiviCRM je robustní open-source CRM systém navržený speciálně pro neziskové organizace, spolky a občanské iniciativy. Projekt je napsán v jazyce PHP a licencován pod GNU Affero General Public License (AGPLv3). Český překlad má nyní 45 % přeložených řetězců a přibližuje se milníku 50 %. Potřebujeme vaši pomoc, abychom se dostali dál. Pokud máte chuť přispět překladem nebo korekturou, přidejte se na platformu Transifex.

    jardaIT | Komentářů: 1
    dnes 12:22 | Bezpečnostní upozornění

    Další lokální zranitelností Linuxu je ssh-keysign-pwn. Uživatel si může přečíst obsah souborů, ke kterým má právo ke čtení pouze root, například soubory s SSH klíči nebo /etc/shadow. V upstreamu již opraveno [oss-security mailing list].

    Ladislav Hagara | Komentářů: 0
    včera 17:22 | Komunita

    Singularity (YouTube) je nejnovější otevřený film od Blender Studia. Jedná se o jejich první 4K HDR film.

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Zajímavý software

    Vyšla hra Život Není Krásný: Poslední Exekuce (Steam, ProtonDB). Kreslená point & click adventura ze staré školy plná černého humoru a nekorektního násilí. Vžijte se do role zpustlého exekutora Vladimíra Brehowského a projděte s ním jeho poslední pracovní den. Hra volně navazuje na sérii Život Není Krásný.

    Ladislav Hagara | Komentářů: 23
    včera 14:00 | Zajímavý projekt

    Společnost Red Hat představila Fedora Hummingbird, tj. linuxovou distribuci s nativním kontejnerovým designem určenou pro vývojáře využívající AI agenty.

    Pinhead | Komentářů: 6
    včera 02:22 | Zajímavý software

    Hru The Legend of Zelda: Twilight Princess od společnosti Nintendo si lze nově díky projektu Dusklight (původně Dusk) a reverznímu inženýrství zahrát i na počítačích a mobilních zařízeních. Vyžadována je kopie původní hry (textury, modely, hudba, zvukové efekty, …). Ukázka na YouTube. Projekt byl zahájen v srpnu 2020.

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

    Byla vydána nová major verze 29.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Detailní přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 0
    13.5. 21:22 | Bezpečnostní upozornění

    Po zranitelnostech Copy Fail a Dirty Frag přichází zranitelnost Fragnesia. Další lokální eskalace práv na Linuxu. Zatím v upstreamu neopravena. Přiřazeno ji bylo CVE-2026-46300.

    Ladislav Hagara | Komentářů: 1
    13.5. 14:00 | Komunita

    Sovereign Tech Agency (Wikipedie) prostřednictvím svého fondu Sovereign Tech Fund podpoří KDE částkou 1 285 200 eur.

    Ladislav Hagara | Komentářů: 11
    13.5. 12:55 | IT novinky

    Google na včerejší akci The Android Show | I/O Edition 2026 (YouTube) představil celou řadu novinek: Gemini Intelligence, notebooky Googlebook, novou generaci Android Auto, …

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (13%)
     (8%)
     (2%)
     (14%)
     (31%)
     (4%)
     (6%)
     (3%)
     (16%)
     (26%)
    Celkem 1632 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: Náhrada za grep -o v sedu

    Mikos avatar 21.4.2006 03:25 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Náhrada za grep -o v sedu
    Přečteno: 330×
    Oblíbil jsem si parametr grepu -o (only matching). Je to nesmírně užitečná věc a často hodně zjednodušuje práci. Nicméně jsem se dozvěděl, že je to v grepu vcelku novinka (maximálně pár let) a že je obsažena pouze v GNU grepu. Zajímá mě tedy, jak bych jí mohl nahradit sedem (ale nějak skutečně jednoduše, né sed skript na několik řádků ;-)), kdybych se někdy dostal k systému kde grep volbu -o nepodporuje.

    Malý příklad, mám soubor test.txt, který obsahuje:
    bla <a href="bla">bla</a> bla <a href="bla">bla</a>
    <a href="bla">bla</a>
    bla <a href="bla">bla</a> bla <a href="bla">bla</a>
    Chci vypsat všechny odkazy v něm (tedy adresy, to je jedno). S použitím grep -o je to jednoduché:
    [mikos@tauri ~]$ grep -o '<a [^>]*>' test.txt
    <a href="bla">
    <a href="bla">
    <a href="bla">
    <a href="bla">
    <a href="bla">
    Ovšem jak na to se sedem? Zkoušel jsem toto:
    [mikos@tauri ~]$ sed -n 's/.*\(<a [^>]*>\).*/\1/gp' test.txt
    <a href="bla">
    <a href="bla">
    <a href="bla">
    Jenže jak je vidět, to vypíše pouze jeden výskyt odkazu na řádku, jelikož ona .* sežere ty ostatní výskyty.

    Je tu nějaký sed-guru, který by poradil co s tím? ;-) Upozorňuju, že to s těmi odkazy je jen příklad, jde mi prostě o obecnou náhradu za grep -o (fungující naprosto stejně jako grep -o, tedy nestojím o žádné hacky jen pro konkrétní příklad).
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!

    Odpovědi

    Mikos avatar 21.4.2006 03:30 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Ještě doplnění - také nestojím o žádný ekvivalent v awk nebo dokonce perlu :-) Prostě chci sed, a to pokud možno jednoduše (viděl jsem už řešení, ale byl to ošklivý sed skript na několik řádek, to nechci).

    Neexistuje v sedu prostě příkaz jako "vypiš pouze matching regexp"? Print (tedy 'p') vypisuje celý řádek co jsem tak zkoušel :-(
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!
    David Watzke avatar 21.4.2006 04:47 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    david@amd64 ~ $ cat lol
    bla <a href="bla">bla</a> bla <a href="bla">bla</a>
    <a href="bla">bla</a>
    bla <a href="bla">bla</a> bla <a href="bla">bla</a>
    
    david@amd64 ~ $ sed -e 's/.*\(<a [^>]*>\).*/\1/gp' lol
    <a href="bla">
    <a href="bla">
    <a href="bla">
    <a href="bla">
    <a href="bla">
    <a href="bla">
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    David Watzke avatar 21.4.2006 04:58 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    A pokud nejsou odkazy na každém řádku, tak použij toto:
    sed -e '/<a/ s/.*\(<a [^>]*>\).*/\1/gp' lol
    vyhledává to jen řádky s "<a" a vyjde to prý mnohem rychleji.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Mikos avatar 21.4.2006 05:46 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Spočítej si kolikrát ti to vyhodí ten výsdledek - ten prostřední řádek to vyhodí 2x. Tzn. tohle není řešení...
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!
    David Watzke avatar 21.4.2006 05:50 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Máš recht... toho jsem si nevšim' :-(
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Mikos avatar 21.4.2006 05:54 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    No i tak díky, snaha se cení ;-)

    Jen doufam že se nějaké skutečné řešení najde (hlavně jednoduché... jak říkam už jsem řešení viděl, ale to byl sed skript na několik řádek a o to fakt nestojim).
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!
    Jan Zahornadsky avatar 21.4.2006 09:12 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Nene... To ti pouze namečuje poslední výskyt hyperrefu na řádku a ten vypíše dvakrát :-(
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    Jan Zahornadsky avatar 21.4.2006 08:43 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Napadlo mě následující řešení: nejdříve si rozsekáme soubor tak, že na jednom řádku bude maximálně jeden hyperref. To zařídíme například tak, že před každý znak "<" a za každý znak ">" vložíme newline. A na to už jde aplikovat docela jednoduchý regexp. Takže konkrétně tvůj případ:
    john@turion ~ $ cat test
    <a href="1"> xxx <a href="2">
    dsjhfsk <a href="3">\bla
    mame tu link <a href="4"> a tady taky <a href="5">
    john@turion ~ $ cat test | sed 's/>/>\n</g; s/</\n</g' | sed -n '/^<a href=".*">/p'
    <a href="1">
    <a href="2">
    <a href="3">
    <a href="4">
    <a href="5">
    
    A nebo abys netvrdil, že je to jednorázový konkrétní hack, tak lze si zařídit jednoduchoučký skriptík grep-o:
    #! /bin/sh
    sed "s/\($1\)/\n\1\n/g" $2 | sed -n "/$1/p"
    
    a teď:
    john@turion ~ $ ./grep-o '<a [^>]*>' test
    <a href="1">
    <a href="2">
    <a href="3">
    <a href="4">
    <a href="5">
    john@turion ~ $ echo "<a hhhh> <b jjjj> <a xxx>" | ./grep-o '<a [^>]*>' -
    <a hhhh>
    <a xxx>
    
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    21.4.2006 09:19 David Watzke
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    sed -e "s/\($1\)/\n\1\n/g" -ne "/$1/p" soubor
    je kratší (a doufám, že funguje, hehe... zrovna to nemůžu ověřit. ale řekl bych, že jo).
    Jan Zahornadsky avatar 21.4.2006 09:48 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    No, tohle natáhne řádek do bufferu (například "Ahoj, <a href="test">, jak se vede?" )rozseká řádek tak, že před a za regexp vloží newliny (v bufferu je teď "Ahoj, \n<a href="test">\n, jak se vede?") a na tento buffer aplikuje druhý regexp a tentokrát se ten regexp porovnává v podstatě se třema řádky najednou. Takže se to mine účinkem :-(

    Ale jo, určitě to moje jde napsat i nějak jinak, jen tak mě napadá
    sed -e "s/\($1\)/\n\1\n/g" "$2" | grep "$1"
    
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    Mikos avatar 21.4.2006 15:21 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Díky, tohle funguje :-) Ale pořád to není řešení problému, rpotože to funguje jen a pouze pokud vím, co najdu. Tedy abych to upřesnil - mohl bych např. chtít hledat ne celý odkaz, ale jen to co je v href="". Tedy něco takového:
    sed 's/<a [^>]*href="\([^"]*\)"[^>]*>/\n\1\n/g' test.txt
    To sice krásně funguje, ale pak už nedokážu sestavit ten druhý sed (či grep), protože prostě nemůžu vědět co v tom href="" bude uloženo. Tedy i když právě si uvědomuju, že tohle bych asi neudělal ani s grep - o :-)

    Každopádně je nějaké řešení i pro tento případ? Ono by to tedy samozřejmě šlo udělat více sedy v koloně, ale neexistuje i nějaké hezší/čistší/jednodušší řešení? Prostě něco jako příkaz print v sedu, ale aby vypsal vždy pouze třeba \1 a ne celý řádek.
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!
    Mikos avatar 21.4.2006 16:54 Mikos | skóre: 34 | blog: Jaderný blog | Praha
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Hmm, já už snad v tomhle na sed rezignuju. Pokud tedy někoho nenapadá ak to elegantně a jednoduše udělat v sedu, napadá aspoň někoho jak to udělat v awk?

    Zkoušel jsem toto:
    [mikos@tauri ~]$ awk '{match($0, /<a [^>]*href="([^"]*)"[^>]*>/, arr); print arr[1]}' test.txt
    bla1a
    bla2
    bla3a
    Jenže jak je vidět, příkaz "match" bere vždy jen první výskyt daného regexpu (tedy jako sed 's/pattern//', prostě bez onoho obligátního 'g'). Navíc co jsem tak koukal, je onen třetí argument u příkazu match také jen GNU rozšířením (tedy pouze v gawku).

    To to opravdu není v sedu ani v awku nějak elegantně a jednoduše řešitelné? To bych opravdu na takovou blbost musel používat python (nebo nedejbože perl, fuj :-P)?
    CETERUM CENSEO DRM ESSE DELENDAM Ostatně soudím, že DRM musí být zničeno!
    21.4.2006 17:25 Pavel1 | skóre: 33
    Rozbalit Rozbalit vše Re: Náhrada za grep -o v sedu
    Pravděpodobně náhrada za grep -o bude vycházet trošku složitěji, proto asi grep tuto volbu má. Tak už to většinou bývá, že náhrada za něco bývá komplikovanější.

    Nejjednodužší, nejpřehlednější a funkční řešení zadaného úkolu grep -o mi připadá (viz. výše) udělat si jednořádkový miniskriptík s obsahem :
    sed -e "s/\($1\)/\n\1\n/g" "$2" | grep "$1"
    
    a pak ten miniskriptík volat s parametry :
    # miniskriptik hledany_retezec v_souboru
    
    Ale určitě k zadanému cíli vede cest více.

    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.