Newsgroup: it.comp.os.linux.iniziare
Titolo: Lunghezza stringhe esadeciamali in bash

Salve a tutti.
In bash ${#STRINGA} riporta la lunghezza di $STRINGA, ma mi sembra di
aver capito che lo fa se e solo se $STRINGA e' composta di caratteri
ascii.
Se invece contiene codici esadecimali non funziona correttamente (o non
ho capito qualcosa io).
Nel caso come posso sapere quanto e' lunga la stringa?
Riporto un esempio di stringa con cui ho a che fare:
ATINIT="V0E0X1&M0&K0&U2&N6S40=7S7=120\x00\x00\x00"
che e' lunga 32 caratteri di cui gli ultimi tre sono tre zeri
esadecimali.
TIA
-- 
manuel 'fmf' ferrero
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 esadecimali.
cosě su due piedi mi verrebbe in mente un 
ATINIT_LEN=`echo -en ${ATINIT}|wc -c`
zozzo, ma funziona...
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Skull says:
The old signature is gone...
Won't you suggest me a new one?!?

 esadecimali.
Un trucco, non so se funge ovunque...
$ ATINIT="V0E0X1&M0&K0&U2&N6S40=7S7=120\x00\x00\x00"
$ expr length "`echo ""${ATINIT}""|sed 's/\x..//g'`"
32
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 32
Interessante. Per la serie TIMTOWTDI...
Non capisco pero' cosa significhi 'expr lenght': expr stampa su stdout
l'espressione che segue, ma lenght?
Intuitivamente immagino valuti la lunghezza, ma in man bash non ho
trovato nulla e man lenght non esiste...
E poi non capisco bene la linea di sed: se non capisco male cerca il
pattern \x seguito da due caratteri qualsiasi, ma non capisco cosa gli
sostituisca e quindi cosa conti.
Puoi spiegarmi?
+++
Anzi, ora l'ho provata sulla mia debian e non funziona:
$ VARI="abc\x00"
$ expr lenght "`echo ""${VARI}""|sed 's/\x..//g'`"
expr: syntax error
TIA.
(Ah, la linea di Skull funziona, grazie.)


 expr: syntax error
Un typo?  length, non lenght
Per il sed  non ti so aiutare, dovrebbe  sostituire ogni occorrenza di
/x seguito da due caratetri qualsiasi con nulla, ma a questo punto non
capisco perche' quel nulla viene conteggiato lo stesso...
-- 
Sono un servitore del Fuoco Segreto, e reggo la fiamma di Anor.
A nulla ti servira' il fuoco oscuro, fiamma di Udun.
Torna nell'Ombra! Non puoi passare.

 capisco perche' quel nulla viene conteggiato lo stesso...
Appunto...
Mah.


 Appunto...
In effetti non viene conteggiato: ad essere conteggiato è il line feed che
echo mette in fondo se non viene richiamato con il -n
Se provi con un
echo ""${VARI}""|sed 's/\x..//g'|hexdump
te ne accorgi facile...
Hola..


 te ne accorgi facile...
il che è vero riferito al mio esempio ma è una cazzata se riferita alla
stringa postata da Robero.
Il trucco della sua è che in effetti quel \x.. viene interpretato come x..
perchè la \, essendo carattere di escape, andrebbe scritta \\. Infatti,
prendendo solo la parte interna, risulta:
skull@yggdrasyl:~$ echo ""${ATINIT}""|sed 's/\x..//g'
V0E0X1&M0&K0&U2&N6S40=7S7=120\\\
mentre:
skull@yggdrasyl:~$ echo ""${ATINIT}""|sed 's/\\x..//g'
V0E0X1&M0&K0&U2&N6S40=7S7=120
Quello che non capisco è che:
skull@yggdrasyl:~$ expr length "`echo ""${ATINIT}""|sed 's/\\x..//g'`"
32
skull@yggdrasyl:~$ expr length "`echo ""${ATINIT}""|sed 's/\x..//g'`"
32
Huh?!?


 32
All'  inizio ho  pensato che  sed sostituisse  un carattere  nulla che
pero' veniva conteggiato lo stesso ?!? ma non sembra neppure essere cosi':
[2022][vale@damun:~]$ expr length "`echo ciao`"
4
[2023][vale@damun:~]$ expr length "`echo ciao | sed 's/.*//'`"
0
[2023][vale@damun:~]$
:-/


 :-/
sed gurus... Please help us.
Che casino ho fatto scoppiare...


 sed gurus... Please help us.
Non penso che il problema sia sed in sč, ma il come expr "conta" la
stringa (o in che "momento" lo fa...):
skull@yggdrasyl:~$ echo ""${ATINIT}""|sed 's/\\x..//g'|wc -c
     30
qui segna 30 perchč uno č il LF a fine stringa aggiunto da echo.
Infatti:
skull@yggdrasyl:~$ echo -n ""${ATINIT}""|sed 's/\\x..//g'|wc -c
     29
Inoltre, il solito hexdump conferma byte per byte...
Ciao...
