Portál AbcLinuxu, 10. května 2025 05:31

Dotaz: práce se sedem

8.3.2011 17:20 Tomasko | skóre: 4
práce se sedem
Přečteno: 176×
Odpovědět | Admin
Dobrý den. Prosím, začínám se sedem. Mám nějaký textový soubor a zkouším si z něj vygenerovat html soubor s tím, že si označuji jednotlivé úseky barevně. Číslo např. 123456, aby se mi označilo modře už jsem zvádnul pomocí: s/([0-9]+)/...(nechtelo mi to tu napsat span) Nebo znak < jsem si do html nahradil, to jsem našel na netu. Jak ale odliším číslo 123456 např. od čísla desetinného? 12234566 vs 0.0987 ?

Ř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

Řešení 1× (buff)
Tarmaq avatar 8.3.2011 17:37 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: práce se sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Neco takoveho?
$ cat foo
12234566
0.0987

$ sed -r 's#^[[:digit:]]+$#<span class="int">\0</span>#' foo               
<span class="int">12234566</span>
0.0987

$ sed -r 's#^[[:digit:]]*\.[[:digit:]]+$#<span class="real">\0</span>#' foo
12234566
<span class="real">0.0987</span>
Don't panic!
8.3.2011 17:41 Tomasko | skóre: 4
Rozbalit Rozbalit vše Re: práce se sedem
napíšeš mi k tomu nějakou omáčku? rozumím jenom tomu span digit -r
Tarmaq avatar 8.3.2011 17:54 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: práce se sedem
ok, takze pouzil jsem sedovsky prikaz substitute (s), ktery se zapisuje v tomto formatu
s/regexp/replacement/
misto lomitek jako oddelovace jsem pouzil #, protoze se mi to hodi abych nemusel "escapovat" lomitko v "replacementu".
jako matchujici regexp jsem pouzil tedy v prvnim pripade ^[[:digit:]]+$, coz znamena ze to matchne ty radky, ktere od zacatku az do konce obsahuji 1-n znaku tridy [:digit:].

Polopate: ^ znamena zacatek radky, $ z namena konec radky, + je kvantifikator znamenajici ze predesly atom ([[:digit:]]) se tam muze vyskytovat 1-n krat

Replacement prvniho pripadu je
<span class="int">\0/span>
, tedy nahradi to presne timto, s tim ze misto \0 bude pouzit cely matchnuty radek. V druhem pripade je to velmi podobne, az na to ze regexp je trochu slozitejsi:
^[[:digit:]]*\.[[:digit:]]+$

znamena ze od zacatku radky se tam muze vyskytovat 0-n (kvatifikator *) znaku tridy [:digit:] nasledujicich teckou a nasledujicich 1-n znaku tridy [:digit:]. Tecku jsem escapoval zpetnym lomitkem, jelikoz bez toho funguje jako atom pro jakykoliv znak
Don't panic!
8.3.2011 19:00 l4m4
Rozbalit Rozbalit vše Re: práce se sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Toto je určitě zajímavá úloha na to naučit se používat sed, ale z praktického hlediska je to šílené řešení.

Běžně se toto řeší nástroji jako highlight, source-highlight nebo i vim, které umožňují definovat syntaxi pomocí strukturovaných pravidel a vygenerovat na jejím základě zvýrazněný soubor.
8.3.2011 19:49 Tomasko | skóre: 4
Rozbalit Rozbalit vše Re: práce se sedem
já se to pokouším napsat nějak takto s/([0-9]+[^\.])/ < span... ale tohle mi sežere jen "0." a za tečkou už mi to zbývající čísla zvýrazní. Chci napsat, aby mi to vzalo jen číslo bez tečky tzn 321 třeba.
8.3.2011 20:16 l4m4
Rozbalit Rozbalit vše Re: práce se sedem
Jak toto souvisí s mým návrhem použít k řešení problému raději nástroje, jež jsou k tomu určeny?

Jinak toto obecně vyžaduje podporu assertions v regulárních výrazech (konkrétně negative look-behind), jaká je třeba v Perlu nebo Pythonu, která umožňuje vyjádřit, že musí/nesmí něco předcházet. V sedu není.

Když si ale za žádnou cenu nedáš poradit a chceš to dělat v sedu, tak další možnost je vícekrokové zpracování, kdy se označkuje číslo v nejobecnějším možném tvaru
#123.456#
#321#
...
čímž se čísla jednoznačně vymezí (jsou jasné začátky a konce), a pak se jednotlivé případy převedou různými regulárními výrazy, které budou matchovat i ty značky
s/#([0-9]*.[0-9]+)#/.../g
s/#([0-9]+)#/.../g
...
Třetí možnost je napsat regulární výrazy, které zpracovávají i okolní znaky, a případně je nezmeněné vracejí do streamu:
s/(^|[^.0-9])([0-9]+)([^.0-9]|$)/\1<<\2>>\3/g
což je ale opět rychle komplikuje.
8.3.2011 20:38 Tomasko | skóre: 4
Rozbalit Rozbalit vše Re: práce se sedem
promiň spletl jsem si odpověď :-(

jinak už jsem na to přišel :

s/([0-9]*[\.][0-9]*)/ < span...

btw, proč mi to nechce vypsat span? či jak ho tu mám dát, v code ani v citaci mě to nepustí
10.3.2011 17:37 Tomasko | skóre: 4
Rozbalit Rozbalit vše Re: práce se sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
ještě se chci zeptat: mám řetězec např "(child" a pak žetězec "(ARCH" a když napíši: s#([(])([A-Z]+)#span...

Tak mi to označí i "child". Jak je to možné, když mám definované pouze velká písmena? Řetězec "(ARCH" se samozřejmě označí správně.
10.3.2011 17:50 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: práce se sedem
Interpretace rozsahů vždycky závisí na použítém locale a občas se mohou chovat dost nepředvídatelně. Jistější je používat [[:lower:]], [[:upper:]] a [[:alpha:]], případně v kombinaci s LC_CTYPE=C.
10.3.2011 20:23 Tomasko | skóre: 4
Rozbalit Rozbalit vše Re: práce se sedem
moc Vám děkuji. Začalo mě to docela bavit a sedím u toho celé dny :-) S [[:...:]] to funguje :-)

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.