Sed isoler les parenthèses

Résolu
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

  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
    1. Contributeur
      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
  2. Contributeur
    Salut,

    Qu'as-tu essayé de faire déjà ?
    0
    1. Ca marche du feu de Dieu. Merci.
      echo 'ab(c)def(ghi)jkl' | sed -rn 's/[^(]*\(([^)]*)\)[^(]*/\1/gp'
      

      Merci.
      0
      1. Contributeur
        De rien ;-))

        Perso j'avais :

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