OT: Editace XML shell scriptem

Dan Lukes dan at obluda.cz
Sat Apr 24 22:44:01 CEST 2010


On 04/24/10 21:00, Zbyněk Burget:
>> Ja s oblibou pouzivam k tomuto ucelu ASCII znak "RS".

> Jo, to je dobry napad - obcas se kouknout do ASCII tabulky a zjistit, ze
> tam jsou znaky, ktere se i daji pouzit.

Je to jeste horsi - oni nejen, ze se daji pouzit - ony byly za timto 
ucelem do ASCII tabulky vlozeny ;-)

> neprisel jsem na to, jak tam muzu tenhle znak vrznout

Nerad rozdavam ryby - daleko vic me bavi naucit rybarit. Ale tady to 
bude tezky - na to, abysis na polozenou otazku mohl odpovedet sam je 
treba mit docela dost velkou sadu informaci.

Ja to vezmu hodne strucne - a to znamena, ze nebudu zminovat, ze ledacos 
co reknu je nebo muze byt za urcitych okolnosti vice ci mene jinak.

Zaprve zde mas ovladac klavesnice - ten zjistuje, co's fyzicky zmacknul 
(a na jake skutecne klavesnici - ta PCckova neni zdaleka jedina). Smerem 
nahoru pak predava uz vice-mene standardni kody. Jaky kod predavany 
nahoru odpovida jakemu kodu predavanemu nahoru je zalezitost typu 
klavesnice a ovladace.

Aby se mi z toho nestala scripta, omezme se pouze na PC-AT klavesnici a 
ji prislusny ovladac. A dale - tech "rozhrani nahoru" je vic nez jedno a 
je na konkrenti aplikaci, aby se rozhodla, jake bude pouzivat. My se 
budeme bavit pouze o "ASCII" rozhrani.

Z PC-AT klavesnice lze pres ASCII rozhrani zaslat vsechny znaky ASCII v 
rozsahu 0-127. Pro vyslani nekterych je na klavesnici samostatna klavesa 
(treba 1 pro ASCII 0x31), pro jine je treba pouzit kombinaci (treba 
SHIFT spolecne s A pro ASCII 0x41). Konkretne znaky s ASCII se 
"vyrabeji" kombinaci CTRL a pismena, jehoz ASCII kod je o 0x40 vetsi nez 
kod, ktery chces vygenerovat.

Nektere kody lze dokonce vygenerovat vice zpusobu - tak napriklad TAB 
(ASCII 9) lze vygenerovat jednak stiskem k tomu vyrobene klavesy, druhak 
ale jako CTRL+I. Nebo LF (ASCII 0x0a) lze krome (hned dvou) klaves 
"Enter" vyrobis i pomoci CTRL-J

Konkretne RS ma kod pak vyrobis pomoci CTRL-^

Jenze - tim potize zdaleka nekonci. Kdyz se ptas "jak tam ty znaky 
vrznout" - tak to se bavis o nejake konkretni aplikaci (patrne nejakem 
editoru nebo prikazove radce nejakeho konkretniho shellu). Uz nahore 
jsem zminilo, ze je na aplikaci, zda bude pouzivat ciste ASCII rozhrani, 
nebo se bdue o to "co by to stisknuto" zajimat detailneji pres nejake 
jine rozhrani.

Takze odpoved an tvoji otazku je "aplikacne specificka".

Ale tady tady problem nekonci. Omezime se pouze na aplikace, ktere 
pouzivaji ciste ASCII rozhrani - ty tedy dostanou konkretni ASCII kod.

Jenze - ASCII kody <32 jsou tradicne chapany jako "pokyn k nejake akci" 
- nikoliv jako "proste znaky k vlozeni". Kdyz prijde kod 65, napise se 
pismeno. Kdyz prijde kod 8 (BS) tak ten se nevlozi - BS je pokyn ke 
smazani jednoho predchoziho znaku. Kod 9 (TAB) je pokyn nabidnout 
"command completion".

Takze i kdyz stiskem CTRL-^ aplikaci odesles znak RS, v textu se stejne 
neobjevi - misto toho, se provede akce tomuto kodu odpovidajici. 
Vetsinou zadna.

Takze bud musis nejprve aplikaci rict "nasledujici znak neni pokyn - 
proste ho vloz", nebo musi mit aplikace uplne odlisny mechanismus na 
vkladani takovych znaku.

Sh a bash voli prvni pristup - a zpusob jak mu rict "pristi znak neni 
prikaz" je zaslani kodu SYN. Takze kdyz prijde samotne RS nestane se 
nic, pokud prijde SYN RS tak se RS vlozi na radku.

Takze odpoved na tvoji otazku pro sh a bash zni - CTRL-V CTRL-^

Editor "joe" pouziva jako escape sekvenci dvojznak ESC ' a po nem bud' 
nasleduje primo znak, ktery chces vlozit, nebo ho lze zapsat i ascii kodem.

Ve 'vi' lze v insert rezimu kody vkladat primo ("escape" tam dela prave 
prechod to editacniho modu). Jak napsat kody v prikazovem rezimu vi nevim.

Vidis jak dlouhou odpoved jsi vyprovokoval ? A to jeste neni jasne, 
jestli je v ni odpvoed na polozenou otazku. A i ty odpovedi, ktere tu 
jsou jsou VELMI hrube zjednodusene ...

> ho vlastne najit...). Mimochodem - kdyz se tam bude nejakou oklikou cpat
> RS, nepujde tam stejnou cestou cpat i LF?

Samozrejme, ze pujde. V shellu sekvenci SYN LF. Na rozdil od prosteho 
LF< ktere by bylo piokynem (zinterpretuj a proved) toto skutecne na 
radek vlozi znak LF aniz by se tim editace radku uzavrela.

Ale k cemu ti to bude ? Manual od 'sed' jasne rika, ze pred LF musi byt 
backslash. No dobre - to jeste neni problem, tak ho tam dame:

\ SYN LF

Tedy \ CTRL-V CTRL-J

Jenze ceho jsi dosahl ? Radek vypada uplne stejne. Ono je opravdu jedno, 
jestli kod LF vygenerujes metodou A nebo metodou B. A sedu je pro zmenu 
jedno, ze bash pred vlozenim mohl vyzadovat nejakou vlastni sekvenci - 
on ma predepsany svuj backslash a hotovo ...

>>> opravdu to nejde obejt nejakym znakem abych ten prikaz dostal na jednu radku?

> Psychicky blok by bylo to posledni, co by mi vadilo - jde mi o to, abych
> ten prikaz mohl zapsat do devd.conf - a tam mi to proste zalomenoy radek
> nebere, at se snazim, jak umim. Chci se vyhnout tomu, abych ten skript
> musel mit ulozeny nekde bokem a z devd ho volat...

Aha. Abych pravdu rekl, parserem konfiguraku pro devd je yacc a token.l, 
coz je cast popisu gramatiky, jasne ukazuje, ze se parser problematice 
zalomenych radku venuje - ale abych zjistil jak presne, na to bych musel 
yacc nastudovat daleko vic.

V teto chvili s emi zda, ze sekvenci \ LF pochopil yacc jako "svoji" a 
radku "odzalomi". Coz samozrejme prikaz pro sed poskodi. Jestli to tam 
lze nacpat tak nejak aby to neposkodil - na to bych opravdu musel ten 
yacc nastudovat lepe ...


						Dan





More information about the Users-l mailing list