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