OT: Editace XML shell scriptem
Dan Lukes
dan at obluda.cz
Fri Apr 23 20:59:50 CEST 2010
On 04/23/10 20:02, Zbyněk Burget:
>> sed
>> '/<device>/,/<\/device>/{/<device>/{h;D;};/<\/device>/{g;s/\n//g;p;D;};H;D;};'
>>
>
> Neco takoveho jsem mel na mysli - teoreticky by se takhle snad dalo i
> zeditovat to <enable> bez toho spojeni cele sekce do jednoho radku
Ano, i to by slo, ale to by pravdepodobne vyzadovalo uz relativne
slozite "programove" konstrukty - tedy smycku a skoky. "Spojeni" do
jednoho radku je samo o sobe (relativne) jednoduche a nasledna editace
uz pak taky.
Ja bych ho delal znovu sedem (ja se totiz s awk tak nejak nikdy
nezkamaradil, i kdyz, nejde-li to jinak, pisu i v nem).
SEDem asi takhle: '/XXXXXX/s;\(<enable>\).*\(</enable>\);\1yes\2;'
kde XXXX je vyraz, kterym bych vybral ten radek, ktery chci menit (ja uz
si presne nepamatuju zadani a tudiz podle ceho se spravny radek poznal)
> Jeste to ma jednu mouchu, ale to uz je drobnost (z vysledku vypadne
> ukoncovaci tag </device>.
Aha, vypadlo pismenko
melo tam byt
{H;g;s/\n//g;p;D;}
> Mohl bych poprosit o vysvetleni?
Jasne. Cele je to uzavreno do podminky, kterou jsi analyzoval spravne:
> /<device>/,/<\/device>/ - adr1,ard2 - vmezeni zajmove casti textu.
To znamena, ze cokoliv co se deje se deje pouze pro radky od <device> do
</device>
> nasleduje skupina prikazu
> /<device>/{h;D;} - vyraz <device> se "zapamatuje" a smaze
Budeme radsi presni - obsah pracovniho bufferu (ktery obsahuje prave
zpracovavany radek) se zkopiruje "do pameti". Tim byl jakykoliv pripadny
obsah "pameti" zlikvidovan. To je to 'h'
'D' smaze pracovni prostor A UKONCI ZPRACOVANI TOHOTO RADKU (sed se
vrhne na dalsi radek). Je tam predevsim kvuli tomu zahajeni dalsiho
cyklu (k prepsani pracovniho prostoru dojde pri zahajeni dalsiho cyklu
tak jako tak).
Cely ten kus ber jako "inicializaci" - provadi se pouze pro prvni radek
cele sady.
> /<\/device>/{g;s/\n//g;p;D;} - vyraz </device> je nahrazen zapamatovanym
> <device>, dal se priznam, ze se ztracim.
Tenhle radek se naopak provadi pouze pro posledni radek skupiny. Ale
vysvetleni pochopis snaz, kdyz si nejprve prectes komentar k telu, ktery
naleznes oznaceny jako ---111111--- a to driv, nez prejdes na dalsi vetu.
Takze - ted zu vis, ze v "pameti" mame kopii cele sekce zacinajici
"<device>". Prave se venujeme jejimu poslednimu radku a chystame se
provest (to 'H' mi puvodne vypadlo):
H;g;s/\n//g;p;D;
'H' nam do "pameti" prida i tenhle nas zaverecny radek - ted uz tam mame
sekci opravdu uplne celou.
'g' nam vytahne cely obsah "pameti" do pracovniho prostoru. Pripominam,
ze v pameti mame nakokopirovane vsechny radky cele sekce a to vcetne
oddelovacu radek mezi nimi.
's/\n//g' nam ty oddelovace odstrani - takze ted mame celou sekci, ale
uz nezalamanou.
'p' vypise obsah pracovniho bufferu na vystup - prave jsme vypsali
nezalamanou sekci
'D' je stary znamy "continue" prikaz - smaze obsah pracovniho bufferu -
a hlavne - zahaji zpracovani dalsiho radku
No a to je vlastne cele.
> Je jasne, ze je tam smazani koncu radku,
> ale nechapu, proc v tomto miste?
> Neco (co?) je vytisteno na stdout
> a neco (co?) smazano.
> H;D; - do "pamatovaciho prostoru" (kde je ulozeno
> <device>?) je pripsan konec radku a vysledek
> (ceho?) a pak je neco (co?) smazano.
---111111---
Tento kus kodu se provadi pro kazdy radek, ktery neni prvni ani posledni
v sekci.
A udela to, ze do "pameti" prida "konec radku" a obsah pracovniho
prostoru (prave zpracovavany radek).
Jinymi slovy - k "<device>", ktere jsme si do pameti dali pri
incializaci proste jen pridavame (bez jakehokoliv zasahu) vsechny dalsi
radky.
To dela to 'H'.
No a 'D' smaze obsah pracovniho prostoru - a zahaji dalsi cyklus. Je tam
ze stejeho duvodu jako 'D' pouzite pri inicializaci.
Tak, a ted se s ctenim muzes vratit zpatky k popisu kodu pro "posledni
radek" - ted uz to pujde pochopit snadno.
---/111111---
>
> uff - sed asi nikdy nezkrotim...
sed je dost "jednosmerny" programovaci jazyk. Jde v nem (relativne)
snadno psat, ale z napsaneho nelze zjistit co to ma delat ;-)
Ale ano, taky za to mohla moje chyba - misto toho, abych to napsal jako
1. /<device>/{zpracovani prvniho;continue}
2. /</device>/{zpracovani posledniho;continue}
3. (bez podminky) zpracovani tela a continue
mel jsme pocitat s tim, ze to po me budes cist a mel jsem to napsat jako:
1. /<device>/{zpracovani prvniho;continue}
2. /<\/device/!/ zpracovani tela a continue
3. (bez podminky) {zpracovani posledniho;continue}
Bylo by to o dost citelnejsi.
Dan
More information about the Users-l
mailing list