# Remplacer les espaces par un underscore ?

**URL:** <https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814>\
**Category:** Programmation\
**Created:** [Février 2, 2018, 5:40 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814 "2018-02-02T17:40:12Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon36725218](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/8e8cbc/32.png) [@anon36725218](https://www.debian-fr.org/u/anon36725218)\
**Post date:** [Février 2, 2018, 5:40 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/1 "2018-02-02T17:40:13Z")

</div>

Bonjour,

Je suis sur une Debian Stretch, mon SHell est : `/bin/bash` et je suis sous KDE depuis Konsole 🙂

Je crée 2 fichiers :

```
touch fichier\ 1-1.txt
touch fichier\ 2-2.txt

```

J’ai mes 2 fichiers dans un répertoire QUE je souhaite modifier (supprimer les espaces) et cela sans fichier (en ligne de commande) :

```
18:02:07 root@orj:~ $ ls -l .
total 3
-rw-r--r-- 1 root root 0 févr. 2 17:52 fichier 1-1.txt
-rw-r--r-- 1 root root 0 févr. 2 17:52 fichier 2-2.txt

```

j’essaie de faire simplement pour tester la commande `sed` :

`find . -type f -name "*.txt" -exec sed -r 's/ /_/g' {} +`

Cela ne me ressort rien !

Si j’envoie cela (tout va bien) :

```
18:11:08 root@orj:~ $ find . -type f -name "*.txt" -exec ls -l {} +
-rw-r--r-- 1 root root 0 févr. 2 17:52 ./fichier 1-1.txt
-rw-r--r-- 1 root root 0 févr. 2 18:08 ./fichier 2-2.txt

```

Au final ce serait quelque chose comme cela (avec un boucle depuis la console) :

```auto
for i in "*.txt"; do mv $i `sed -r -n 's/ /_/g' $i`; done;

```

NdM : Avant sed et après $i (avant le done) il un apostrophe à l’envers. 😕

Mais je n’y arrive pas. Qui peut m’aider ^^

En vous remerciant.

Cordialement,  
Romain

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 2, 2018, 6:40 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/2 "2018-02-02T18:40:56Z")

</div>

```nohighlight
rename 's/\s+/_/g' *

```

dans un alias:

```nohighlight
alias bouchetrous='rename '\''s/\s+/_/g'\'''

```

---

<div class="post-metadata">

**Author:** ![anon36725218](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/8e8cbc/32.png) [@anon36725218](https://www.debian-fr.org/u/anon36725218)\
**Post date:** [Février 2, 2018, 8:06 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/3 "2018-02-02T20:06:43Z")

</div>

Merci @josephtux ! Trop fort 😉

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 6, 2018, 3:51 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/4 "2018-02-06T15:51:31Z")

</div>

Il suffisait de connaître l’existence de la commande rename, très utile et très simple.

Par exemple, aujourd’hui j’ai fait:

`rename -- 's/^-//' *`  
pour supprimer tous les «-» en début de nom de fichier qui perturbent beaucoup de commandes (toutes celles qui ignorent le paramètre «- -»)

Elle peut faire des choses très compliquées et subtiles, en fonction de ses compétences avec les expressions régulières. C’est un script Perl, donc il bénéficie de tout ce que les regex de Perl offrent.

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 7, 2018, 9:22 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/5 "2018-02-07T09:22:51Z")

</div>

Ou en pur bash\*:  
`for file in *.txt ; do mv "$file" ${file/ /_} ; done`

cf [http://wiki.bash-hackers.org/syntax/pe#search\_and\_replace](http://wiki.bash-hackers.org/syntax/pe#search_and_replace)

\* enfin presque, puisque mv n’est pas une commande built-in

Ce que j’aime bien avec `rename` aussi c’est l’option `-nono` qui permet de simuler le renommage, pour s’assurer que la commande fera bien ce qu’on veut.

---

<div class="post-metadata">

**Author:** ![Clochette](https://www.debian-fr.org/user_avatar/www.debian-fr.org/clochette/32/8757_2.png) [@Clochette](https://www.debian-fr.org/u/Clochette)\
**Post date:** [Février 7, 2018, 7:28 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/6 "2018-02-07T19:28:29Z")

</div>

Je viens de déplacer le fil, l’erreur est régulière … la catégorie ‘Trucs et Astuces’ est là pour en proposer pas en demander 😛

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 8, 2018, 11:06 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/7 "2018-02-08T11:06:17Z")

</div>

> [@josephtux](#):
>
> dans un alias:
> 
> ```plaintext
> alias bouchetrous=‘rename ‘’‘s/\s+/_/g’’’’
> 
> ```

Est-ce que tu aurais une référence synthétique sur les «&nbsp;quoting tricks&nbsp;» de bash ? Tu savais tout de suite que tu devais tripler la première quote de la commande rename dans l’alias, ou comme moi tu tâtonnes à chaque fois que des quotes ou des double quotes doivent s’encastrer ?

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 8, 2018, 7:21 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/8 "2018-02-08T19:21:21Z")

</div>

J’ai fais ça il y a longtemps, mais j’ai certainement du chercher à comprendre et tatonner.  
Désolé de décevoir sur mes compétences!

@Sputnik93  
Merci, très utile «`-nono` » (`-n`), car les «`rename`» trop vite fais sont parfois pénibles à défaire!  
« `rename -n` » m’évitera certainement quelques angoisses et bévues.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 10, 2018, 1:45 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/9 "2018-02-10T13:45:37Z")

</div>

ça ne serais pas plutôt:

```auto
mv "$file" ${file// /_}

```

(2 slash avant l’espace, que je représente ici par ÷, ne réussissant pas à afficher « 2 slash puis un espace puis un slash puis le signe \_»)

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 10, 2018, 6:55 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/10 "2018-02-10T18:55:24Z")

</div>

Bonsoir **josephtux**

J’espère que je ne me suis pas trompé en modifiant la présentation de ligne de commande que tu proposais dans ton message en fonction de la description que tu donnais entre parenthèses.

J’ai fait précéder et suivre ta ligne de commande par une ligne vide ne contenant que trois caractères backtics

Tu peux visualiser le texte brut de ton message  
en cliquant sur l’icône qui ressemble à un crayon qui est située entre le drapeau et les trois points

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 11, 2018, 2:40 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/11 "2018-02-11T14:40:30Z")

</div>

Merci MicP  
C’est exactement ça.

Pour écrire du code, il faut 3 “anti-apostrophes” sur une ligne séparée, avant et après le code, précédé d’une ligne vide? c’est bien celà?

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 11, 2018, 3:09 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/12 "2018-02-11T15:09:08Z")

</div>

> [@josephtux](#):
>
> c’est bien celà?

Oui, C’est bien ça.

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Février 12, 2018, 9:58 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/13 "2018-02-12T09:58:15Z")

</div>

Si tu doubles le premier slash, tu remplaces chaque espace par un underscore, si tu ne mets qu’un seul slash, tu remplaces uniquement le premier. Cela dépend de ce que tu veux faire.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 13, 2018, 11:16 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/14 "2018-02-13T11:16:22Z")

</div>

Oui, et c’est ce que [**ZW3B**](https://www.debian-fr.org/u/ZW3B) cherchait, puisqu’il veut supprimer les espaces de noms de fichiers.

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 13, 2018, 4:36 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/15 "2018-02-13T16:36:10Z")

</div>

Bonjour

Tu as certe résolue ton problème mais je te signale que tu peux utiliser les script bash avec les espaces en modifiant la variable `IFS`

Mets toi dans un dossier où tu as des noms de fichiers avec des espaces

```
for i in $(ls); do
echo $i
done

```

comme tu le constates ce n’est pas bon, essaye comme ci-dessous

```nohighlight
IFS='
'
for i in $(ls); do
echo $i
done

```

Normalement c’est bon

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 15, 2018, 5:59 UTC](https://www.debian-fr.org/t/remplacer-les-espaces-par-un-underscore/75814/16 "2018-02-15T17:59:52Z")

</div>

Pourquoi  
`for i in $(ls)`  
quand (je crois que)  
`for i in *`  
fait le même travail (contrairement à `ls -A`)?

D’autre part, paresse sans doute, avoir à modifier `IFS` pour chaque commande en ligne est pénible, c’est pourquoi je préfère «boucher les trous» systématiquement et oublier le problème qui ressurgirait un jour ou l’autre, sans doute dans une situation plus désagréable.

Mais il n’est pas inutile d’en rappeler l’existence, particulièrement utile dans les scripts.
