# BASH : extraction chaine de caracteres

**URL:** <https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256 "2016-02-21T21:03:43Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/1 "2016-02-21T21:03:43Z")

</div>

Bonjour à tous,

Je fais un petit script en bash et me retrouve face à un problème.

J’ai une chaine de caractère qui est contenu dans une variable “CHAINE”. Cette chaine contient le mot “TOTO” et “TATA”.

Je voudrais pouvoir extraire de cette chaine tous ce qui se trouve entre les mots TOTO et TATA.

---

<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 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/2 "2016-02-21T21:03:45Z")

</div>

```auto
michel@debG53SW:~$ motif1="TOTO"
michel@debG53SW:~$ motif2="TATA"
michel@debG53SW:~$ CHAINE="mon copain TOTO est allé demander des sous à sa TATA l'autre jour."
michel@debG53SW:~$ CHAINE2=${CHAINE#*${motif1}}
michel@debG53SW:~$ echo \"${CHAINE2%${motif2}*}\"
" est allé demander des sous à sa "
michel@debG53SW:~$ 
```

```auto
michel@debG53SW:~$ motif1="TOTO"
michel@debG53SW:~$ motif2="TATA"
michel@debG53SW:~$ echo "mon copain TOTO est allé demander des sous à sa TATA l'autre jour." > monFichierTexte
michel@debG53SW:~$ sed -n "s/.*${motif1}\(.*\)${motif2}.*/\"\1\"/p" monFichierTexte
" est allé demander des sous à sa "
michel@debG53SW:~$ 
```

---

<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, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/3 "2016-02-21T21:03:50Z")

</div>

(en anglais) mais complet

[mywiki.wooledge.org/BashGuide/Pa … \_Expansion](http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion)

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/4 "2016-02-21T21:03:51Z")

</div>

Je viens d’essayer cette méthode :

[quote=“MicP”]`michel@debG53SW:~$ motif1="TOTO"
michel@debG53SW:~$ motif2="TATA"
michel@debG53SW:~$ CHAINE="mon copain TOTO est allé demander des sous à sa TATA l'autre jour."
michel@debG53SW:~$ CHAINE2=${CHAINE#*${motif1}}
michel@debG53SW:~$ echo \"${CHAINE2%${motif2}*}\"
" est allé demander des sous à sa "
michel@debG53SW:~$`[/quote]

Ca marche mais qu’est ce que c’est long O\_O je met 3-4 minutes pour exécuter les lignes [mono]CHAINE2=${CHAINE#_${motif1}}[/mono] et [mono]echo "${CHAINE2%${motif2}_}"[/mono].  
Certe y’a du monde dans ma variable mais quand même… Y’a pas une solution qui irait plus vite?

L’autre solution avec sed ne me convient pas car il faut passer par un fichier intermédiaire.

---

<div class="post-metadata">

**Author:** ![alpha](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/6a8cbe/32.png) [@alpha](https://www.debian-fr.org/u/alpha)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/5 "2016-02-21T21:03:52Z")

</div>

tu n’as pas besoin d’un fichier ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

```auto
michel@debG53SW:~$ motif1="TOTO"
michel@debG53SW:~$ motif2="TATA"
michel@debG53SW:~$ echo "mon copain TOTO est allé demander des sous à sa TATA l'autre jour." | \
sed -n "s/.*${motif1}\(.*\)${motif2}.*/\"\1\"/p" 
" est allé demander des sous à sa "
michel@debG53SW:~$ 
```

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/6 "2016-02-21T21:03:52Z")

</div>

cool [mono]sed[/mono] est bien plus rapide, à peine quelques secondes.

Par contre il m’a viré tous les sauts de ligne : J’ai une variable qui contient une grande quantité de texte. Il y’a donc des retour à la ligne.

J’ai adapter la ligne [mono]sed[/mono] pour l’utiliser avec ma variable :  
[mono]echo $mavariable | sed -n “s/._${motif1}(._)${motif2}.\*/”\1"/p"[/mono]

la fonction [mono]sed[/mono] fait bien son boulot par contre elle en profite pour me virer tous les sauts de ligne (la méchante) 🙂

Un dernier petit coup de main pour que mes retours à la ligne soit préservé svp.

---

<div class="post-metadata">

**Author:** ![alpha](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/6a8cbe/32.png) [@alpha](https://www.debian-fr.org/u/alpha)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/7 "2016-02-21T21:03:53Z")

</div>

essaye d’enlever -n et p

```auto
sed "s/.*${motif1}\(.*\)${motif2}.*/\"\1\"/"
```

Edit :

je te conseille d’ajouter g. normalement, ça donne les même resultats

```auto
sed "s/.*${motif1}\(.*\)${motif2}.*/\"\1\"/g"
```

autre chose :  
selon la description sur le site suivant. \1 représente la première occurrence de l’expression. je ne comprends pas donc pour quoi motif1 et 2 n’apparaissent pas dans le résultat malgré qu’ils appartiennent à l’expression?  
est-ce-que parce qu’ils sont des variables ?

[stackoverflow.com/a/4613362/3140467](http://stackoverflow.com/a/4613362/3140467)

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:03 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/8 "2016-02-21T21:03:54Z")

</div>

> [@alpha](#):
>
> essaye d’enlever -n et p

> [@alpha](#):
>
> je te conseille d’ajouter g.

J’ai fais ces deux choses, le résultat de SED reste le même et les sauts de ligne de ma variable ne sont toujours pas la.

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 9:04 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/9 "2016-02-21T21:04:25Z")

</div>

salut,

[quote]les sauts de ligne de ma variable ne sont toujours pas la.[/quote]parce que, sans guillemets autour de la variable, ils ne sont pas transmis à `sed’ !

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:04 UTC](https://www.debian-fr.org/t/bash-extraction-chaine-de-caracteres/64256/10 "2016-02-21T21:04:26Z")

</div>

> [@Watael](#):
>
> parce que, sans guillemets autour de la variable, ils ne sont pas transmis à `sed’ !

En effet, c’était bien ça.

Merci
