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

--
FreeBSD mailing list ([email protected])
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem