web-dev-qa-db-fra.com

grep: regex uniquement pour faire correspondre quelque chose entre parenthèses

Comment puis-je faire correspondre Word uniquement entre parenthèses

Entrée: this is (test.com)

Sortie désirée: test.com

22
Rahul Patil

Voici quelques options, qui impriment toutes la sortie souhaitée:

  1. Utilisation de grep avec le -o flag (imprime uniquement la partie correspondante de la ligne) et les expressions régulières compatibles Perl (-P) qui peut faire lookarounds :

    printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'
    

    Cette expression régulière pourrait nécessiter quelques explications:

    • (?<=\(): Il s'agit d'un lookbehind positif , le format général est (?<=foo)bar et cela correspondra à tous les cas de bar trouvés juste après foo. Dans ce cas, nous recherchons une parenthèse ouvrante, nous utilisons donc \( pour y échapper.

    • (?=\)): Ceci est un lookahead positif et correspond simplement à la parenthèse fermante.

  2. Le -o option à grep fait en sorte qu'elle n'imprime que la partie correspondante de n'importe quelle ligne, nous recherchons donc tout ce qui est entre parenthèses puis les supprimons avec sed:

    printf "this is (test.com)\n" | grep -o '(.*)' | sed 's/[()]//g'
    
  3. Analysez le tout avec Perl:

    printf "this is (test.com)\n" | Perl -pe 's/.*\((.+?)\)/$1/'
    
  4. Analysez le tout avec sed:

    printf "this is (test.com)\n" | sed 's/.*(\(.*\))/\1/'
    
29
terdon

Une approche consisterait à utiliser PCRE - Expressions régulières compatibles Perl avec grep:

$ echo "this is (test.com)" | grep -oP '(?<=\().*(?=\))'
test.com

Références

5
slm