# Ajouter un éspace entre deux caracteres

**URL:** <https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401 "2016-02-21T19:58:24Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/1 "2016-02-21T19:58:24Z")

</div>

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:

```auto
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:

```auto
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 “]” 😕  
comment faire pour retirer les espaces a la fin ?

---

<div class="post-metadata">

**Author:** ![Zbf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/e68b1a/32.png) [@Zbf](https://www.debian-fr.org/u/Zbf)\
**Post date:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/2 "2016-02-21T19:58:26Z")

</div>

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 ?

```auto
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… 😉  
Edit2: de la triche d’utiliser $chaine[1] $chaine[2] pour ne sortir que le 1er et 2nd caractère ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/3 "2016-02-21T19:58:28Z")

</div>

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`

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/4 "2016-02-21T19:58:59Z")

</div>

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 😕  
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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:58 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/5 "2016-02-21T19:58:59Z")

</div>

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 😕  
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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/6 "2016-02-21T19:59:00Z")

</div>

Je peux pas y faire grand chose essaie ça :

`apt-get install strace
strace ./script.sh`

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/7 "2016-02-21T19:59:00Z")

</div>

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

```auto
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:

```auto
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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/8 "2016-02-21T19:59:01Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/9 "2016-02-21T19:59:01Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/10 "2016-02-21T19:59:01Z")

</div>

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`

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/11 "2016-02-21T19:59:01Z")

</div>

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:

```auto
[
[=
[==
[===
[====
                              ]
```

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.

```auto
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.

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/12 "2016-02-21T19:59:02Z")

</div>

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 😛

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/13 "2016-02-21T19:59:02Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/14 "2016-02-21T19:59:03Z")

</div>

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

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

La ligne 26 est celle ci:

```auto
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 ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/15 "2016-02-21T19:59:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/16 "2016-02-21T19:59:04Z")

</div>

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:

```auto
test=$(echo $COLUMNS)
echo $test
```

cela me renvoie rien…

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/17 "2016-02-21T19:59:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![jjbond](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/e9bcb4/32.png) [@jjbond](https://www.debian-fr.org/u/jjbond)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/18 "2016-02-21T19:59:04Z")

</div>

> [@MisterFreez](#):
>
> printf «&nbsp;[%s%s]&nbsp;» «&nbsp;${progress:0:$i}&nbsp;» "${empty:0:$test-$i}

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 "-")`

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/19 "2016-02-21T19:59:04Z")

</div>

[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 😛 )

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401/20 "2016-02-21T19:59:05Z")

</div>

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}"
}`

[Page suivante](https://www.debian-fr.org/t/ajouter-un-espace-entre-deux-caracteres/61401.md?page=2)
