#1 Le 09/09/2017, à 11:02
- Hizoka
Compter les caractères sans les couleurs
Bonjour et bon week-end à vous
Entrons dans le vif du sujet :
x="\033[1;31mBonjour\e[m"
echo -e "$x"
=> Bonjour
C'est génial, oui je sais
Mais j'aurais besoin de compter le nombre de caractères de $x SANS les couleurs soit 7 lettres.
J'ai testé pas mal de truc mais... sans résultat
echo "${#x}" # 21
wc -m <<< "${#x}" # 22
echo -e "${x}" | wc -m # 18
et pas mal de sed...
Une idée de comment faire ?
Merci.
Dernière modification par Hizoka (Le 09/09/2017, à 11:09)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 09/09/2017, à 11:33
- Watael
Re : Compter les caractères sans les couleurs
salut,
il est recommandé, lorsqu'on souhaite appliquer un format à des données, de les séparer.
ça peut être fait en appelant printf :
x="bonjour"
formatRouge='\033[01;31m%s\033[0m'
printf "${formatRouge} contient %d caractères\n" ${#x} "$x"
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 09/09/2017, à 12:12
- Hizoka
Re : Compter les caractères sans les couleurs
Le truc c'est que ma variable se remplit de plein d'infos et de couleurs, et l'ordre n'est pas connu...
du coup, utiliser printf me parait compliqué...
Je pense donc en effet utiliser plus de variables, avec et sans couleurs.
Merci.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 09/09/2017, à 12:14
- Watael
Re : Compter les caractères sans les couleurs
ma variable se remplit de plein d'infos et de couleurs
pourquoi ? comment ?
ça aussi, c'est mal.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 09/09/2017, à 12:32
- Hizoka
Re : Compter les caractères sans les couleurs
Pourquoi est-ce mal ?
Bah le principe c'est de créer une barre de progression.
output="[%n] [%b] %t"
ca va m'afficher : "[025%] [======== ] infos"
Je veux permettre la coloration des différents éléments.
le truc, c'est que output peut prendre n'importe quelle forme...
je fais du genre :
x="${output//%n/${Couleur1}${Nombre}}"
x="${output//%t/${Couleur2}${Text}}"
...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 09/09/2017, à 13:01
- Watael
Re : Compter les caractères sans les couleurs
même si ça paraît plus compliqué a priori, je ferais ça avec printf (parce que c'est fait pour ça, et que le faire autrement, forcément, c'est mal ) et des codes d'échappement ANSI.
unset n eq; until ((n++ >= 10)); do eq+='='; printf '^[[E^[[A[%d] [%s]' "$n" "$eq" ; sleep 1; done; echo
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 09/09/2017, à 13:24
- Hizoka
Re : Compter les caractères sans les couleurs
Le truc c'est qu'il y a pas mal de conditions, des changement de couleurs à certains moments...
du coup passer par une variable est plus simple à faire.
et on m'a proposé : ansi2txt
echo -ne "$x" | ansi2txt | wc -c
Sur ubuntu, ansi2txt fait parti du package kbtin.
Du coup je vais mal faire (soit avec cette commande, soit en passant par des variables avec et sans couleurs)
Merci à toi
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 10/09/2017, à 11:00
- Watael
Re : Compter les caractères sans les couleurs
il y a pas mal de conditions, des changement de couleurs à certains moments
je ne vois pas d'incompatibilité :
unset n eq
until ((n++ >= 10))
do
eq+='='
test ${#eq} -le 5 && fmt='\033[01;32m' || fmt='\033[01;31m'
printf '\033[E\033[A[%d] ['"$fmt"'%s\033[0m]' "$n" "$eq"
sleep 1
done; echo
Dernière modification par Watael (Le 10/09/2017, à 11:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 10/09/2017, à 11:23
- kholo
Re : Compter les caractères sans les couleurs
salut,
j'ai pris le truc différemment pour les couleurs... et pour faire un menu :
#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION=""
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
#
# ----------------------------------------------
echo "lancement $nomlogiciel..."
# ******************************************************************
# fixe la taille de la fenetre
# ******************************************************************
# /usr/bin/resize -s 31 130 > /dev/null
# reset > /dev/null
# ******************************************************************
# DECLARATION DES COULEURS
# ******************************************************************
#
# Texte : # Fond :
# 30, 40 : noir ;
# 31, 41 : rouge ;
# 32, 42 : vert ;
# 33, 43 : jaune ;
# 34, 44 : bleu ;
# 35, 45 : rose ;
# 36, 46 : cyan ;
# 37, 47 : gris / blanc ;
# 0 : retour aux paramètres par défaut ;
# 1 : texte en gras ;
# 4 : souligner ;
# 5 : clignotant ;
# 7 : surligner.
enGras='\033[1m'
enSouligner='\033[4m'
enClignotant='\033[5m'
enSurligner='\033[7m'
# explications
# echo -e "\033[31mHello\033[00m"
# On écrit \033, on met un crochet ouvrant [,
# puis on met le code de la couleur choisie (ici, 31 signifie rouge)
# et on finit avec un m.
# On affiche notre texte,
# ici Hello, puis on remet la couleur à noir (\033[00m),
# sinon le reste sera écrit en rouge aussi. :)
#
# exemples complexes
# enNoir='\033[1;30;40m'
# enRouge='\033[1;31;40m'
# enVert='\033[0;32;40m'
# enJaune='\033[1;33;40m'
# enBleu='\033[1;34;40m'
# enRose='\033[1;35;40m'
# enCyan='\033[1;36;40m'
# enGris='\033[7;37;40m'
enNoir='\033[30m'
enRouge='\033[31m'
enVert='\033[32m'
enJaune='\033[33m'
enBleu='\033[34m'
enRose='\033[35m'
enCyan='\033[36m'
enGris='\033[37m'
endefaut='\033[0m'
# ******************************************************************
# JOURNAL
# ******************************************************************
fichier_log="$nomlogiciel.log"
> "$fichier_log";
journal () { echo -e "$@" >> "$fichier_log" ; }
journal "*******************initialisation*******************"
journal "chargement"
# ******************************************************************
# FONCTIONS POUR LA LISTE DE CHOIX
# ******************************************************************
pause () { read -p 'Appuyer sur [Enter] pour contnuer...' ; }
on_clear_terminal () {
# echo -e "${endefaut}"
reset > /dev/null
}
afficherMenu () {
echo -e "${enJaune}______________________________"
echo -e "${enJaune}${enGras}Un titre.${endefaut}"
echo -e "${enJaune}Ce module crée une liste de choix"
echo -e "${enJaune}"
echo -e "${enJaune}Faire un choix dans :"
echo -e "${enJaune}______________________________"
echo -e "${enJaune} 1. ${enVert}voir"
echo -e "${enJaune} 2. ${enVert}ouvrir"
echo -e "${enJaune} 3. ${enVert}enregistrer"
echo -e "${enJaune} 4. ${enVert}enregistrer-sous"
echo -e "${enJaune} 5. ${enVert}fonction test"
echo -e "${enJaune}______________________________"
echo -e "${enRouge}${enGras}99. ${enVert}Quitter${endefaut}"
echo -e "${enVert}______________________________\n"
echo -e "${enGris}Votre choix :\t"
}
parserChoix () {
case "$choix" in
1) action "$choix" ;;
2) action 2 ;;
3) action 3 ;;
4) action 4 ;;
5) fonction_test ;;
# 66) on_clear_terminal ;;
99) _quitter ;;
*) ;;
esac
}
_quitter () {
journal "_quitter"
# mettre ici tout ce qui sera nescessaire à la bonne fermeture
exit 0
}
# ******************************************************************
# METTRE TOUTES LES FONCTIONS ICI
# ******************************************************************
action () {
echo -e "${enRouge}vous avez choisi action $1 \n ... choisissez 'voir' !"
pause
}
fonction_test () {
message="${enJaune}$(date)\n${enGris}On peut mettre ce que l'on veut ici"
echo -e "$message"
pause
}
# ******************************************************************
# FONCTION PRINCIPALE
# ******************************************************************
_main () {
on_clear_terminal
afficherMenu
# saisie du choix
read -r choix
on_clear_terminal
parserChoix
_main
}
_main
exit 0
Hors ligne
#10 Le 10/09/2017, à 14:10
- Brice Jeunieaux
Re : Compter les caractères sans les couleurs
salut,
j'ai pris le truc différemment pour les couleurs... et pour faire un menu :#!/bin/bash # ---------------------------------------------- nomlogiciel="${0##*/}" FONCTION="" VERSION="alpha" # NOTES DE VERSIONS # ---------------------------------------------- # # ---------------------------------------------- echo "lancement $nomlogiciel..." # ****************************************************************** # fixe la taille de la fenetre # ****************************************************************** # /usr/bin/resize -s 31 130 > /dev/null # reset > /dev/null # ****************************************************************** # DECLARATION DES COULEURS # ****************************************************************** # # Texte : # Fond : # 30, 40 : noir ; # 31, 41 : rouge ; # 32, 42 : vert ; # 33, 43 : jaune ; # 34, 44 : bleu ; # 35, 45 : rose ; # 36, 46 : cyan ; # 37, 47 : gris / blanc ; # 0 : retour aux paramètres par défaut ; # 1 : texte en gras ; # 4 : souligner ; # 5 : clignotant ; # 7 : surligner. enGras='\033[1m' enSouligner='\033[4m' enClignotant='\033[5m' enSurligner='\033[7m' # explications # echo -e "\033[31mHello\033[00m" # On écrit \033, on met un crochet ouvrant [, # puis on met le code de la couleur choisie (ici, 31 signifie rouge) # et on finit avec un m. # On affiche notre texte, # ici Hello, puis on remet la couleur à noir (\033[00m), # sinon le reste sera écrit en rouge aussi. :) # # exemples complexes # enNoir='\033[1;30;40m' # enRouge='\033[1;31;40m' # enVert='\033[0;32;40m' # enJaune='\033[1;33;40m' # enBleu='\033[1;34;40m' # enRose='\033[1;35;40m' # enCyan='\033[1;36;40m' # enGris='\033[7;37;40m' enNoir='\033[30m' enRouge='\033[31m' enVert='\033[32m' enJaune='\033[33m' enBleu='\033[34m' enRose='\033[35m' enCyan='\033[36m' enGris='\033[37m' endefaut='\033[0m' # ****************************************************************** # JOURNAL # ****************************************************************** fichier_log="$nomlogiciel.log" > "$fichier_log"; journal () { echo -e "$@" >> "$fichier_log" ; } journal "*******************initialisation*******************" journal "chargement" # ****************************************************************** # FONCTIONS POUR LA LISTE DE CHOIX # ****************************************************************** pause () { read -p 'Appuyer sur [Enter] pour contnuer...' ; } on_clear_terminal () { # echo -e "${endefaut}" reset > /dev/null } afficherMenu () { echo -e "${enJaune}______________________________" echo -e "${enJaune}${enGras}Un titre.${endefaut}" echo -e "${enJaune}Ce module crée une liste de choix" echo -e "${enJaune}" echo -e "${enJaune}Faire un choix dans :" echo -e "${enJaune}______________________________" echo -e "${enJaune} 1. ${enVert}voir" echo -e "${enJaune} 2. ${enVert}ouvrir" echo -e "${enJaune} 3. ${enVert}enregistrer" echo -e "${enJaune} 4. ${enVert}enregistrer-sous" echo -e "${enJaune} 5. ${enVert}fonction test" echo -e "${enJaune}______________________________" echo -e "${enRouge}${enGras}99. ${enVert}Quitter${endefaut}" echo -e "${enVert}______________________________\n" echo -e "${enGris}Votre choix :\t" } parserChoix () { case "$choix" in 1) action "$choix" ;; 2) action 2 ;; 3) action 3 ;; 4) action 4 ;; 5) fonction_test ;; # 66) on_clear_terminal ;; 99) _quitter ;; *) ;; esac } _quitter () { journal "_quitter" # mettre ici tout ce qui sera nescessaire à la bonne fermeture exit 0 } # ****************************************************************** # METTRE TOUTES LES FONCTIONS ICI # ****************************************************************** action () { echo -e "${enRouge}vous avez choisi action $1 \n ... choisissez 'voir' !" pause } fonction_test () { message="${enJaune}$(date)\n${enGris}On peut mettre ce que l'on veut ici" echo -e "$message" pause } # ****************************************************************** # FONCTION PRINCIPALE # ****************************************************************** _main () { on_clear_terminal afficherMenu # saisie du choix read -r choix on_clear_terminal parserChoix _main } _main exit 0
Merci pour ton code, c'est vraiment intéressant cette manière de colorer par variables.
Par contre, j'ai réperé un petit bug de fonctionnement. En effet, sur une ligne de code en particulier (que je t'ai mis ci-dessous), j'ai voulu, juste par simple test de ton code, j'ai remplacé " {enGras} " par " {enSouligner} ", et à l'exécution du script, les termes "Un titre.", qui étaient bien en jaune et en gras à l'origine, deviennent soulignés, mais écrit en marron. Il faudrait que tu vois l'origine à ce problème, mais si tu as codé ça juste pour répondre à la problématique originale de la conversation, alors, je peux essayer de voir, à ça, étant donné que la gestion des couleurs me sera utile pour le développement d'un mini projet perso.
echo -e "${enJaune}${enGras}Un titre.${endefaut}"
Voilà voilà, c'était juste pour signaler (par contre, je ne sais pas s'il y a d'autres bugs, je vais voir à ça, je bosse sur plusieurs choses en même temps).
Hors ligne
#11 Le 10/09/2017, à 15:16
- Watael
Re : Compter les caractères sans les couleurs
je n'en démordrai pas.
si, un jour, vous me voyez mettre des indications de formatage dans des données, je vous autorise à me bannir du forum.
c'est sale, et la requête d'Hizoka en fait la démonstration.
vous imaginez une base de données, dont les données comporteraient des indications de formatage ?
ah, le joyeux bordel !
par contre, les données peuvent être des indications de formatage !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 10/09/2017, à 15:35
- Hizoka
Re : Compter les caractères sans les couleurs
Quel sacré débat
Au final, j'ai fait en effet 2 versions de la variable, de base aucune info sur la coloration, je ne le colore qu'au moment de l'afficher même si ça diminue le nombre de possibilité.
J'ai très bien avancé dans ma commande, donc je la posterai et vous me proposerez des améliorations
kholo, pour la coloration c'est ce que je fais aussi, je passe par des variables, mais du coup je me suis lancé dans l'utilisation de tput qui est plus simple niveau des noms de couleurs (1-255).
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#13 Le 11/09/2017, à 08:33
- kholo
Re : Compter les caractères sans les couleurs
pas question de mettre des infos de formatage dans les données.
par contre pour afficher un menu c'est jouable et ça fonctionne un peu comme la localisation
et j'ai essayé avec les fonctions mais c'est plus lourd même si ça évite les balises de fermeture ${enDefaut}
duTexteLocalise="Bonjour Monde Cruel"
enBleu () { echo -e "\033[34m${@}\033[0m" ; }
enBleu "${duTexteLocalise}"
echo "ce texte n'est pas affecté"
echo "j'écris du texte avec $(enBleu "${duTexteLocalise}") et je continue"
@Brice Jeunieaux
je pense que les codes couleurs sont un peu bizarres
echo -e "\033[33mJAUNE\033[0m
\033[1;33mJAUNE\033[0m"
on peut toujours combiner
echo -e "${enJaune}${enSouligner}${enGras}Un titre.${endefaut}"
Hors ligne