Newsgroup: it.comp.os.linux.iniziare
Titolo: bash, sostituzione di stringa, unicode ed ansi

In uno script[¹] che usa esclusivamente istruzioni bash, non mi raccapezzo su
una cosa particolare.
 
L'editor che uso mi consente di inserire lettralmente i caratteri di controllo
nel testo, ma io se posso, preferisco inserire la notazione con la barra inversa
davanti.
 
La variabile "background_char" non viene purgata dal comando ansi "cursore a
destra di 1 posizione" se uso la notazione "\\e\[C".
 
Se al posto di "\\e" metto letteralmente il carattere ESC, funziona bene.
 
 
 
 
Un esempio alternativo da terminale bash (con cursore a destra di 3 caratteri):
r="pape\xe2\x96\x84\e[3C\xe2\x96\xb2rino" ; printf '%b\n' "$r" ; g="${r//\\e\[3C/0}" ; printf '%b\n' "$g"
 
da giustamente:
pape▄   ▲rino
pape▄0▲rino
 
 
e qui sopra funziona...
 
 
 
 
[¹]
# -----------------------------------------------------------------------
 
#!/usr/bin/env bash
 
######################################
#     perchè "status1" sballa????
######################################
 
color=7
printf -v print_col '%b' "\\e[38;5;${color}m"
Bcolor=0
printf -v back_col '%b' "\\e[48;5;${Bcolor}m"
block_width="     "
brushH="\xe2\x96\x81\xe2\x96\x82\xe2\x96\x83\e[C\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88"
printf -v brush_char "$brushH"
 
 
# La variabile brushH è creata in base all'input dell'utente. Unicode e comandi ansi sono ammessi!!
# Questo è un esempio reale.
#
# per funzionare correttamente, debbo inserire il carattere ascii ESC invece del suo equivalente
# in:        background_char="${background_char1//\\e\[C/ }"
# ossia:     background_char="${background_char1//^[[C/ }"
#                                                 ^^
#                                             carattere ESC
 
 
print_palette() {
    background_char="█"
    status+="$(printf "%8s" $color) ${print_col}${block_width// /${background_char}}\\e[m "
    background_char=" "
    status+="$(printf "%8s" $Bcolor) ${back_col}${block_width// /${background_char}}\\e[m   "
    background_char1=${block_width//?/$brush_char}
 
    background_char="${background_char1//\\e\[C/ }"           #  punto che non capisco
 
    status1="${back_col}${print_col}${background_char:: ${#block_width}}"
}
 
 
print_palette
 
echo
 
printf 'brushH             %b' "$brushH"
echo
echo
 
printf 'background_char1   %b' "$background_char1"
echo
echo
 
printf 'background_char    %b' "$background_char"
echo
echo
 
printf 'status1            %b' "$status1"
printf '%b' "\\e[0m\n\n"
echo
echo
 
# -----------------------------------------------------------------------
 
 
 
-- 
... Proverbio: Niente popo' di meno, cioe` la stessa quantita` di popo'
--- FMail 1.02
* Origin: <> The Day After BBS +39-2-58108--- 28.800 24h/24h (2:331/374)


Qual'e` lo scopo di questa cosa?
 
Magari esistono metodi piu` corretti rispetto
a metter i codici con escape.
 
Per esempio, "tput" fa gia` alcune cose in
maniera indipendente (o dipendente) dal
terminale usato.
 
bye,
 
-- 
 
piergiorgio

 terminale usato.
 
Indubbiamente usare awk o sed che sono più famosi e gettonati.
Lo scopo?
 
Si tratta di un editor sofisticato per creare disegni a colori in pixel art che
per, diciamo esperimento, deve fare uso esclusivamente di comandi bash.
Awk, cut, sed, grep, et similia, sono bannati.
 
Il progetto è concluso e va a meraviglia, solo non mi ci raccapezzo il motivo
di quel particolare caso, e sono curioso di capire il perchè.
 
 
-- 
--- GoldED 2.40
* Origin: Fs95... 30% faster than FS2 on an Apple //c ! (2:335/332.20)

 di quel particolare caso, e sono curioso di capire il perchè.
 
Allora, ripeto la domanda, qual'e` lo scopo?
 
Se devi "disegnare" a terminale, non in grafica,
allora non si devono usare i comandi diretti
con sequenze escape, ma "tput".
Perche` questo traduce in sequenze come funzione
del terminale.
 
Usare sequenze escape non e` corretto.
Puo` funzionare, ma non vi e` sicurezza.
 
Oppure ho capito male la ragione di
quelle sequenze escape.
 
bye,
 
-- 
 
piergiorgio

 quelle sequenze escape.
 
Non serve solo disegnare, ma creare loghi o banner, e creare un file di soli
comandi ansi visualizzabile con un semplice 'cat nomefile'.
 
## Based from a work of Dylan Araps
## 
https://www.patreon.com/dyla
 
## 
https://github.com/dylanaraps
 
##
## -->  
https://github.com/dylanaraps/pxltrm
 
 
Questo era il punto di partenza, poi, corretti alcuni piccoli bachi, ho
ampliato il programma in modo estremamente corposo aggiungendo parecchie cose.
 
Il punto della mia questione, indipendentemente dal programma, era di capire il
perchè, in quel contesto, la sostituzione di stringa contenente un escape, non
funzionava con quella sintassi, ma voleva il carattere escape inserito
letteralmente, cosa che invece nel piccolo esempio messo nel testo e, aggiunto
in fondo allo script postato, funziona correttamente.
 
 
-- 
--- Terminate 4.00
* Origin: Non calpestare l' erba, fumala! (2:334/204.18)

 in fondo allo script postato, funziona correttamente.
 
In generale, perche` quelle cose non si fanno! :-)
 
Tra l'altro, c'e` "libaa", che forse ha
qualche equivalente shell, non saprei,
che disegna a terminale usando "ASCII art".
 
Comunque, per rispondere :-) alla tua domanda
precisa: non ho idea...
 
bye,
 
-- 
 
piergiorgio

 Per esempio, sempre "tput", puo` essere
 
Puoi dirmi se tput c'e' e in che pacchetto per la Debian TIA?
 
(le sequenze ansi di BIG Umberto sono interessantissime, ma conosco
solo e male quelle per i colori e non mi riesce di seguirle)
 
-- 
bye, Yoda
 

 solo e male quelle per i colori e non mi riesce di seguirle)
 
Come scritto prima, il problema e` che
quelle sequenze dipendono, almeno in parte,
dal tipo di terminale: VT100, ANSI, etc.
E magari, forse, dalla versione.
 
Quindi non e` possibile usarle in maniera
sicura, spesso funzionano, ma non e` detto.
 
L'unica alternativa che io conosco e`
affidarsi a "termcap", "terminfo" e "tput".
 
In teoria, c'e` un database (credo "termcap")
che contiene i codici di escape per ogni
terminale.
Tra l'altro, provando, si vede che molti
codici sono identici.
 
bye,
 
-- 
 
piergiorgio

 precisa: non ho idea...
 
Questo era il succo della domanda.
 
 
-- 
   _:o:_
 /~~~~~~|\
|  [+]  |__\
|_--____--_|
  ()    ()
~~~~~~~~~~~~~
 
--- Terminate 5.00 Salame Version
* Origin: I diritti sono riservati, ma i rovesci copiateli pure
(2:331/220.34)

 universale.
 
Uhm, non saprei, tra "\", virgolette
singole e doppie, varie ed eventuali
potrebbe non sempre essere ovvio.
 
bye,
 
-- 
 
piergiorgio

 solo e male quelle per i colori e non mi riesce di seguirle)
 
Guarda che non è niene di spaciale!
 
https://en.wikipedia.org/wiki/ANSI_escape_code
 
 
Mentre quelle tipo \xe2\x96\x84, sono normali caratteri unicode
 
https://en.wikipedia.org/wiki/Category:Unicode_charts
 
 
https://en.wikipedia.org/wiki/Template:Unicode_chart_Block_Elements
 
 
https://en.wikipedia.org/wiki/List_of_Unicode_characters
 
 
https://stackoverflow.com/questions/602912/how-do-you-echo-a-4-digit-unicode-character-in-bash
 
 
La sequenza che ho usato all'inizio del mio script (qui, separate da uno spazio):
    \xe2\x96\x81  \xe2\x96\x82  \xe2\x96\x83  \e[C  \xe2\x96\x88  \xe2\x96\x88  \xe2\x96\x88
 
è una scaletta di 3 gradini (3 unicode), un comando cursore destra (ansi) poi 3
blocchi pieni (ancora 3 unicode).
 
    ▁▂▃ ███
 
Mentre i codici ansi \e[38;5;colore e \e[48;5;colore settano i colori 0-255 di
sfondo e primo piano.
 
L'uso di 'printf' anzichè del classico 'echo' è perchè printf è molto più
performante rispetto l'altro comando (man bash - ricerca di printf).
 
 
 
Banalmente (da un segmento usato):
 
#!/bin/bash
 
    printf "\\e[2J\\e[3;1H"
    printf '\e[2C\e[48;5;0m%56s\e[m\n'
    for j in 8 9 a b
    do
        for i in 0 1 2 3 4 5 6 7
        do
            v1="$j$i"
            printf "\\e[2C\\e[48;5;0m $v1 \xe2\x96\x$v1"
        done
            printf '\e[48;5;0m\e[m\n'
            printf '\e[2C\e[48;5;0m%56s\e[m\n'
        for i in 8 9 a b c d e f
        do
            v1="$j$i"
            printf "\\e[2C\\e[48;5;0m $v1 \xe2\x96\x$v1"
        done
            printf '\e[48;5;0m\e[m\n'
            printf '\e[2C\e[48;5;0m%56s\e[m\n'
    done


 su "iniziare"...
 
Stavo guardando un po' di esempi di tput...
https://www.commandlinefu.com/commands/using/tput
 
 
Bellino, verso la metà il mandelbrot..
https://wiki.bash-hackers.org/scripting/terminalcodes
 
 
 
-- 
--- MirEdit 1.21f [Supp]
 * Origin: Ho fatto l'amore con Control: domani provo CapsLock (2:335/317.0)

     done
 
-- 
Yoda