Sed isoler les parenthèses

Résolu/Fermé
hblkjack Messages postés 8 Date d'inscription lundi 19 décembre 2011 Statut Membre Dernière intervention 14 février 2012 - 19 déc. 2011 à 10:58
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 19 déc. 2011 à 11:42
Bonjour,
Je souhaiterais faire un exercice en sed mais je n'y arrive pas.
On dispose d'un fichier de texte contenant des parenthèses, et on suppose que la parenthèse ouvrante et la parenthèse fermante de chaque paire de parenthèses se trouvent sur une même ligne. Il peut y avoir plusieurs paires de parenthèses (non imbriquées) par ligne. Afficher uniquement le texte contenu entre parenthèses. Ainsi,

% echo 'ab(c)def(ghi)jk' | sed ... 
cghi


Pourriez vous m'aider svp?

3 réponses

hblkjack Messages postés 8 Date d'inscription lundi 19 décembre 2011 Statut Membre Dernière intervention 14 février 2012 1
19 déc. 2011 à 11:12
J'ai essayé avec les backreferences mais ca ne marche pas bien vu que je ne sais pas exactement combien de () il peut y avoir. Dans l'exemple il y en a 2 mais il pourrait y en avoir 3 ou 4.
echo 'ab(c)def(ghi)jk' | sed -nre 's/.*\((.*)\).*/\1/gp'

ou même
echo 'ab(c)def(ghi)jk' | sed -nre 's/^.*\((.*)\).*/\1/gp'
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
19 déc. 2011 à 11:20
Attention à la gourmandise des regex !!!

Un ".*" est beaucoup trop gourmand, et va englober trop de choses ;-\

Il faut que tu joues avec des expressions du genre (je n'emploie pas l'option "-r") :
(\([^)]*\))
Qui vont sélectionner dans la référence arrière des caractères se trouvant après une parenthèse ouvrante, mais s'arrêter avant la première parenthèse fermante "[^)]".
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
19 déc. 2011 à 11:06
Salut,

Qu'as-tu essayé de faire déjà ?
0
hblkjack Messages postés 8 Date d'inscription lundi 19 décembre 2011 Statut Membre Dernière intervention 14 février 2012 1
19 déc. 2011 à 11:38
Ca marche du feu de Dieu. Merci.
echo 'ab(c)def(ghi)jkl' | sed -rn 's/[^(]*\(([^)]*)\)[^(]*/\1/gp'

Merci.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
19 déc. 2011 à 11:42
De rien ;-))

Perso j'avais :

sed -n 's/[^(]*(\([^)]*\))[^(]*/\1/gp'
0