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