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

21

Comment faire correspondre le mot uniquement entre parenthèses

Contribution : this is (test.com)

Sortie désirée: test.com

Rahul Patil
la source
1
Recherchez-vous une expression rationnelle «grep» pour correspondre, ou, par exemple, une commande de remplacement «sed» pour générer votre sortie affichée?
rickhg12hs

Réponses:

28

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

  1. Utilisation grepavec le -odrapeau (n'imprimer que la partie correspondante de la ligne) et les expressions régulières compatibles Perl ( -P) qui peuvent faire des contournements :

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

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

    • (?<=\(): Ceci est un lookbehind positif , le format général est (?<=foo)baret qui correspondra à tous les cas de barrecherche juste après foo. Dans ce cas, nous recherchons une parenthèse ouvrante, nous utilisons donc \(pour y échapper.

    • (?=\)): Ceci est une anticipation positive et correspond simplement à la parenthèse fermante.

  2. L' -ooption de le grepfait imprimer uniquement 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/'
    
terdon
la source