# Bash : expressions régulières et expressions rationnelles

**URL:** <https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510 "2016-02-20T15:02:16Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![usinagaz](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/u/ecae2f/32.png) [@usinagaz](https://www.debian-fr.org/u/usinagaz)\
**Post date:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510/1 "2016-02-20T15:02:16Z")

</div>

Bonjour,  
j’ai un peu de mal avec les dites expressions … je voudrai formater une chaine de caractère ou un paragraphe , mettons :

[quote]20:mis à jour  
45:mis à jour  
mis à jour  
[/quote]  
en [quote]20 45[/quote]  
c’est à dire remplacer/supprimer :

- les carctères de ponctuation (":" ici)
- tous caractères autres que numérique
- tous retour à la ligne
- éventuellement toute succession de plus d’un espace en un espace unique.

cela en utilisant le moins de tubes possible … vous pouvez me donner un exemple détaillé ?

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510/2 "2016-02-20T15:02:17Z")

</div>

partons du principe que tu veux ne récupèrer que les chiffres dans un fichier fic, et que le nombre d’espace qui les sépare ne t’importe pas, ça me semblait plutôt simple avec une commande awk caractère par caractère de remplacer tous les non numérique par des blancs:

```auto

```

Bon, mais ça marche pas, et je ne sais pas pkoi.  
Mais ça doit poas être loin quand même 😆

---

<div class="post-metadata">

**Author:** ![usinagaz](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/u/ecae2f/32.png) [@usinagaz](https://www.debian-fr.org/u/usinagaz)\
**Post date:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510/3 "2016-02-20T15:02:17Z")

</div>

merci Matt, mais partons plutôt d’une chaine de caractère … d’une variable, non du contenu d’un fichier (quoique on peut mettre le contenu dans une variable, mais collons au plus proche du point de départ stp, plus clair pour moi …). Bon voilà ma solution, qui est pas belle, lourde, et qui me gave :

point de départ, j’ai une variable RESULT qui vaut :

[quote]20:mis à jour  
45:mis à jour  
mis à jour[/quote]  
Si dans mon code, je fais : `RESULT=`echo "$RESULT" | sed s/[:alpha:]//g | sed s/[a-z]//g`` j’obtiens :

[quote=“echo $RESULT”]20  
45

[/quote]  
puis : `RESULT=${RESULT//
/' '}` j’obtiens :

> [@](#):
>
> 20 (ici il y a 3 espaces par exemple) 45

puis : `RESULT=${RESULT// /}` j’obtiens :

> [@](#):
>
> 20 45

Pour vous donner une idée, mais j’attend quelquechose de plus efficace … parce que là, ça me fais quand même :

`RESULT=`echo "$RESULT" | sed s/[:alpha:]//g | sed s/[a-z]//g`
RESULT=${RESULT//
/' '}
RESULT=${RESULT// /}`3 lignes un peu lourdes non ?  
en fait, je n’arrive pas à introduire un test OU dans sed ou dans ${RESULT// /}, le plus simple serait un truc du style :  
${RESULT//successiond’espaces OU lettres OU ponctuation OU retourdechariot/}

---

<div class="post-metadata">

**Author:** ![stonfi](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/54ee81/32.png) [@stonfi](https://www.debian-fr.org/u/stonfi)\
**Post date:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510/4 "2016-02-20T15:02:20Z")

</div>

sed ‘s/[:alpha:]//;s/[a-z]//g’

---

<div class="post-metadata">

**Author:** ![usinagaz](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/u/ecae2f/32.png) [@usinagaz](https://www.debian-fr.org/u/usinagaz)\
**Post date:** [Février 20, 2016, 3:02 UTC](https://www.debian-fr.org/t/bash-expressions-regulieres-et-expressions-rationnelles/4510/5 "2016-02-20T15:02:24Z")

</div>

Merci stonfi, ça rend pas ce que je veux mais ça m’a permis de trouver autre chose :

`RESULT=`echo "$RESULT" | \
    sed 's/[:alpha:]//;s/[a-z]//g' | \
      tr -d '\n' | tr -s ' '``  
Mais est-ce qu’il y a pas mieux … 😕  
nb : ligne 1 lit la variable, ligne 2 enlève les caractères de ponctuation et lettres, lignes 3 enlève saut de ligne et remplace toute succession d’espace par une occurence d’espace …  
ps: oui c’est pas retour de chariot que je voulais dire, mais saut de ligne …
