Sed isoler les parenthèses

Résolu
hblkjack Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   -
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?

A voir également:

3 réponses

hblkjack Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   1
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Contributeur Dernière intervention   6 431
 
Salut,

Qu'as-tu essayé de faire déjà ?
0
hblkjack Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   1
 
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   Statut Contributeur Dernière intervention   6 431
 
De rien ;-))

Perso j'avais :

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