Ajouter un éspace entre deux caracteres

Bonjour,
Je ne sais pas si ce type de post a déjà été traité si c’est le cas veuillez m’excuser du doublon.
Voila, ce que je voudrais faire c’est de rajouter un espace entre deux caractères que voici: '[]'
Sous forme de boucle:
Ex:

chaine='[]'
for i in `seq 1 100`
do
[ ] # 1ere boucle
[  ]# 2eme boucle
[   ]# 3eme boucle 
[100 espaces] # 100eme boucle
done

Merci d’avance pour vos réponses
EDIT:

chaine='[]'
space=' '
for i in `seq 1 100`
do 
	sleep 1
	echo -ne "\033[$()G"
	space+=" "
	echo -ne $chaine| sed "s/./&$space/g"
done

Avec ce code ca rajoute bien un espace a chaque tour de boucle le soucis c’est que ca en rajoute un a la fin du “]” :confused:
comment faire pour retirer les espaces a la fin ?

Pas certain d’avoir compris mais… sortir l’artillerie sed n’est peut-être pas nécessaire.

Est-ce que cette boucle fait le boulot ?

for i in `seq 1 100`
do
space="$space"_
echo \["$space"\]
done

Edit: bon réflexion faite je pense que tu veux conserver la chaîne définie avant, et que tu ne peux pas l’éclater manuellement comme je le propose… :wink:
Edit2: de la triche d’utiliser $chaine[1] $chaine[2] pour ne sortir que le 1er et 2nd caractère ?

Avec sed :

for i in `seq 1 100` ; do v=$(echo "$v" | sed 's/\[\([ ]*\)\]/[ \1]/') done
ou avec la redirection :

for i in `seq 1 100` ; do v=$(sed 's/\[\([ ]*\)\]/[ \1]/' <<< "$v") done

Bonjour, merci pour vos réponses!
Effectivement je souhaite conserver la chaine de départ.
C’est a dire que l’espace entres les deux [] augmente toute les secondes.
Sur la même ligne.

Misterfreez:
Les deux codes que tu m’as donnés ne fonctionnent pas :confused:
cela me renvoie rien. le script se ferme a l’instant ou je le lance…
Même en mettant le -x au début il m’affiche rien

Bonjour, merci pour vos réponses!
Effectivement je souhaite conserver la chaine de départ.
C’est a dire que l’espace entres les deux [] augmente toute les secondes.
Sur la même ligne.

[quote=“MisterFreez”]for i in seq 1 100 ; do
v=$(echo “$v” | sed ‘s/[([ ]*)]/[ \1]/’)
done[/quote]

[quote=“MisterFreez”]for i in seq 1 100 ; do
v=$(sed ‘s/[([ ]*)]/[ \1]/’ <<< “$v”)
done[/quote]
Les deux codes que tu m’as donnés ne fonctionnent pas :confused:
cela me renvoie rien. le script se ferme a l’instant ou je le lance…
Même en mettant le -x au début il m’affiche rien

Je peux pas y faire grand chose essaie ça :

apt-get install strace strace ./script.sh

Je viens de trouver une solution,que dit tu de ceci ?

chaineZ='[]'
space=''
for i in `seq 1 100`
do 
	sleep 1
	echo -ne "\033[$()G"
	space+=" " 
	echo -ne $chaineZ| sed "s/./&$space/"|sed -re 'y/ /=/'
done

A la fin je remplace l’espace par un ‘=’ pour simuler une barre de progression.
Par contre j’ai plusieurs questions:

  • Est ce possible de mettre une fin de progression par rapport a la fenêtre?
    Ex: quand le ‘]’ arrive au bout de la fenêtre il stoppe la progression.
    Dans mon code j’ai fait une fonction timmer:
timmer() {
for compteur in $(seq 1 3600)
do
    sleep 1
    echo -ne "\033[$()G"
    if [ $compteur -gt 59 ]
    then
        let min=compteur/60 # division entière
        let sec=compteur%60 # reste ou modulo
        echo -n "$min:$sec "
    else echo -n "$compteur "
    fi
done
}
  • Est possible de combiner les deux affichage ?
    Ex: le timmer a gauche de l’écran et la progression a droite.

Pourquoi tu crée des espaces si c’est pour les remplacer par des « = » ?

bar='====================================================================================================' for i in {0..100} do sleep 1 echo -ne "\033[$()G" printf "[%s]" "${bar:0:$i}" done
Si ta chaine est vraiment celle que tu nous montre pourquoi s’embêter à la parser ?
Si c’est juste un exemple, il faut découper la chaine une fois, pour séparer le début de la fin et reconstruire la chaine à chaque itération.

Merci pour cette astuce !
Effectivement pas besoin de crée un espace pour le remplacer …

Cependant, est ce que c’est possible de lui donner une fin a la progression ?
par rapport a la position du caractere ‘]’ par exemple.

Tu voudrait dès le départ que [ et ] soient écartés de 100 ?

bar='====================================================================================================' empty="${bar//=/ }" for i in {0..100} do sleep 1 echo -ne "\033[$()G" printf "[%s%s]" "${bar:0:$i}" "${empty:0:100-$i}" done

Je n’avais pas pensé a cette solution, mais oui ce serait bien.
J’ai testé ton code mais cela ne m’affiche pas tout sur une ligne.
voila le résultat:

[
[=
[==
[===
[====
                              ]

Peut être un problème sur la taille de la fenêtre ?
Edit: c’est bien un problème de fenêtre quand la fenêtre est trop petite cela me renvoie ce que je t’ai mis plus haut.
Dans ce cas serait-il possible de ne plus faire de 0 a 100 mais du début de la fenêtre a la fin ?
Edit2: Grace a la commande tput cols je peux savoir le nombre de colonnes que comporte la sortie écran et donc en déduire la fin.

fin=$(tput cols)
test=$(($fin-2))
bar='===================================================================================================='
empty="${bar//=/ }"
for i in $(seq 0 $test)
do
   sleep 1
   echo -ne "\033[$()G"
   printf "[%s%s]" "${bar:0:$i}" "${empty:0:$test-$i}"
done

Ce qui m’amène a ma deuxième question comment je peux faire pour combiner la progression et le timmer…
Ce qui me dérange le plus c’est de savoir ou placer dans le code l’appel a la fonction du timmer.

Juste pour dire : si c’est pour afficher une barre de progression, pourquoi réintenter la roue alors qu’il existe des outils éprouvés tels que [mono]dialog[/mono]?

Ceci étant si c’est pour travailler son shell, je comprends :stuck_out_tongue:

Je l’écrirais ainsi :

test=$(($COLUMNS-2)) bar='====================================================================================================' empty="${bar//=/ }" for i in {0..$test} do sleep 1 echo -ne "\033[$()G" printf "[%s%s]" "${bar:0:$i}" "${empty:0:$test-$i}" done
Tu peut créer une fonction ainsi :

function progress() { local test=$(($COLUMNS-2)) local bar='==============================================================================================================' local empty="${bar//=/ }" progress=${1:-$(($progress+10))} echo -ne "\033[$()G" printf "[%s%s]" "${progress:0:$i}" "${empty:0:$test-$i}" }
Ensuite à chaque fois que tu veux faire avancer la barre de progression :

[code]# Action 1
progress 5 # on passe la barre à 5%

Action 2

progress # on passe la barre à 15 %[/code]
Par contre il ne faut rien écrire d’autre sur la sortie standard.

@agentsteel> Je connais mal dialog. C’est peut être très bien, mais c’est une dépendance pas forcément nécessaire du moins si c’est juste pour faire attendre 100s. J’ai regardé vite fait, peut être que le mixedgauge pourrait le faire, mais vite fait j’ai pas bien compris comment ça fonctionne (et j’aime pas les interfaces curses).

J’ai testé ta fonction mais lorsque je l’appelle j’ai cette erreur:

./barre.sh: line 26: empty: -2-: erreur de syntaxe : opérande attendue (error token is "-")

La ligne 26 est celle ci:

printf "[%s%s]" "${progress:0:$i}" "${empty:0:$test-$i}"

Si je peux me permettre, tu fait appel à ‘$COLUMNS’ mais je ne le vois pas déclaré.
Est ce une variable d’environnement ?

[quote=“jjbond”]

printf "[%s%s]" "${progress:0:$i}" "${empty:0:$test-$i}" [/quote]
Hum tu le lance bien avec bash ?
Au pire, il faut faire le calcul avant et passer le résultat à la place de l’opération.

[quote=“jjbond”]Si je peux me permettre, tu fait appel à ‘$COLUMNS’ mais je ne le vois pas déclaré.
Est ce une variable d’environnement ?[/quote]
Non c’est une variable que bash crée au moment où tu t’en sert (c’est légèrement différent).

oui je le lance bien avec bash ^^

c’est comme si $columns est vide … quand je tente d’afficher $test cela me renvoie rien.
j’ai meme tenter avec ceci:

test=$(echo $COLUMNS)
echo $test

cela me renvoie rien…

Je viens de voir que cette variable n’existe qu’en interactif (c’est logique en fait… :blush: ).
Désolé, utilise tputs à la place.

Sauf erreur de ma part il n’y a pas de boucle dans la fonction l’appel a $i est peut etre la raison de l’erreur ?
L’erreur: /barre.sh: line 26: empty: -2-: erreur de syntaxe : opérande attendue (error token is "-")

[quote=“MisterFreez”]
@agentsteel> Je connais mal dialog. C’est peut être très bien, mais c’est une dépendance pas forcément nécessaire du moins si c’est juste pour faire attendre 100s. J’ai regardé vite fait, peut être que le mixedgauge pourrait le faire, mais vite fait j’ai pas bien compris comment ça fonctionne (et j’aime pas les interfaces curses).[/quote]
je ne connais pas bien non plus mais il y a des exemple dans /usr/share/doc/dialog/examples

cd /usr/share/doc/dialog/examples sh gauge
(oui c’est du ncurses :stuck_out_tongue: )

Excuse-moi je suis un boulet voici :

function progress() { local test=$(($COLUMNS-2)) local bar='==============================================================================================================' local empty="${bar//=/ }" progress=${1:-$(($progress+10))} echo -ne "\033[$()G" printf "[%s%s]" "${progress:0:$progress}" "${empty:0:$test-$progress}" }