Como fazer «grep -P“ foo (b.r) ”» mostra apenas o que há entre parênteses? Eu preciso de perl?

2

Eu tenho um arquivo grande e estou tentando obter todas as correspondências de uma expressão regular dele.

grep -P "foo (b.r)"

Exibe todas as linhas que contêm «foo b.r» e gostaria de exibir apenas o que há dentro dos colchetes.

Pergunta profissional: o que fazer se eu tiver mais de um conjunto de colchetes? Por exemplo, «foo (b.r) foo (.ar)», e quero que a saída consista apenas na coisa no primeiro e no segundo colchetes, separados por um separador.

Estou marcando esse Perl, porque tenho certeza de que poderia usar «perl -e" ... "» - a pergunta para especialistas em Perl, como escrever isso? Faz anos que eu usei o Perl:)

    
por kolinko 13.04.2011 / 11:04

2 respostas

3

Talvez use grep's -o

   -o, --only-matching
      Show only the part of a matching line that matches PATTERN.

, que vai deixar você com todo o padrão, em seguida, seguir com outro sed (?) para remover / substituir os delimitadores (foo)?

Eu duvido que seja "eficiente", mas fará o trabalho.

    
por 13.04.2011 / 11:07
1
perl -ne '/foo \((.+?)\)/ and print "$1\n";'

Aqui \( \) são parênteses literais e ( ) cria um grupo.

Se uma linha puder corresponder várias vezes, isso deve funcionar:

perl -ne 'print "$1\n" for /foo \((.+?)\)/g;'

Descriptografando oneliners:

  • a and bif (a) {b}
  • b if aif (a) {b}
  • b for afor (a) {b}
por 13.04.2011 / 12:59