Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 09/09/2017, à 12:02

Hizoka

Compter les caractères sans les couleurs

Bonjour et bon week-end à vous smile

Entrons dans le vif du sujet :

x="\033[1;31mBonjour\e[m"
echo -e "$x"

=> Bonjour

C'est génial, oui je sais tongue

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 ? smile

Merci.

Dernière modification par Hizoka (Le 09/09/2017, à 12:09)

Hors ligne

#2 Le 09/09/2017, à 12: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"

eval, c'est mal.

Hors ligne

#3 Le 09/09/2017, à 13: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.

Hors ligne

#4 Le 09/09/2017, à 13: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.


eval, c'est mal.

Hors ligne

#5 Le 09/09/2017, à 13: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}}"

...

Hors ligne

#6 Le 09/09/2017, à 14: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 wink ) 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

eval, c'est mal.

Hors ligne

#7 Le 09/09/2017, à 14: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) tongue

Merci à toi wink

Hors ligne

#8 Le 10/09/2017, à 12: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, à 12:00)


eval, c'est mal.

Hors ligne

#9 Le 10/09/2017, à 12: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, à 15:10

Brice Jeunieaux

Re : Compter les caractères sans les couleurs

kholo a écrit :

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. smile

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). smile


It's a pitch black. You're likely to be eaten by a grue.

Hors ligne

#11 Le 10/09/2017, à 16: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 ?  hmm
ah, le joyeux bordel !

par contre, les données peuvent être des indications de formatage !
big_smile


eval, c'est mal.

Hors ligne

#12 Le 10/09/2017, à 16:35

Hizoka

Re : Compter les caractères sans les couleurs

Quel sacré débat smile

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 wink

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).

Hors ligne

#13 Le 11/09/2017, à 09: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