BASH : extraction chaine de caracteres

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.

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:~$ 
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:~$ 

(en anglais) mais complet

mywiki.wooledge.org/BashGuide/Pa … _Expansion

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.

tu n’as pas besoin d’un fichier :mrgreen:

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:~$ 

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) :slightly_smiling:

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

essaye d’enlever -n et p

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

Edit :

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

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

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.

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’ !

En effet, c’était bien ça.

Merci