grep: regex apenas para correspondência de qualquer coisa entre parênteses

17

Como faço para coincidir a palavra apenas entre parênteses

Entrada: this is (test.com)

Saída do desejo: test.com

    
por Rahul Patil 29.11.2013 / 00:05

2 respostas

25

Aqui estão algumas opções, todas impressas na saída desejada:

  1. Usando grep com o sinalizador -o (somente parte correspondente da linha de impressão) e expressões regulares compatíveis com Perl ( -P ) que podem fazer lookarounds :

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

    Esse regex pode precisar de algumas explicações:

    • (?<=\() : esse é um aspecto positivo , o formato geral é (?<=foo)bar e corresponderá a todos os casos de bar encontrados logo após foo . Neste caso, estamos procurando por um parêntese de abertura, então usamos \( para escapar dele.

    • (?=\)) : esta é uma visão positiva e simplesmente corresponde ao parêntese de fechamento.

  2. A opção -o para grep faz com que ela imprima apenas a parte correspondente de qualquer linha, portanto, procuramos o que está entre parênteses e, em seguida, excluímos com sed :

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

    printf "this is (test.com)\n" | perl -pe 's/.*\((.+?)\)/$1/'
    
  4. Analise tudo com sed :

    printf "this is (test.com)\n" | sed 's/.*(\(.*\))//'
    
por 29.11.2013 / 01:28
4

Uma abordagem seria usar PCRE - Expressões regulares compatíveis com Perl com grep :

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

Referências

por 29.11.2013 / 01:32