Imprimir a sequência entre dois parênteses


14

Eu tenho arquivo com estas linhas

G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)

Eu preciso da saída como

G1,G3
G3,G4
.....

Como posso fazer isso com o comando sed / grep ou usando o perl?

Respostas:


17

Algumas outras maneiras:

  • sed

    sed 's/.*(\(.*\))/\1/' file 
  • perl

    perl -pe 's/.*\((.*)\)/$1/' file 

    ou

    perl -lanF"[()]" -e 'print $F[1]' file 

    ou

    perl -pe 's/.*\((.+?)\).*/$1/;' file 
  • awk

    awk -F"[()]" '{print $2}' file 
  • Concha

    while IFS="()" read a b; do echo "$b"; done < file 

Como você dizer mais sobre como awk método funciona, é fácil de lembrar também?
satch_boogie

1
@satch_boogie -Fpermite escolher quais caracteres o awk usará para dividir a linha em campos. Aqui, estou dando a ele uma classe de caractere ( []) que consiste em abrir e fechar parênteses. Então ele vai dividir a linha em (e sobre ). Como resultado, o segundo campo será o conteúdo dos parênteses. Por exemplo, com a string G8 = P(G1,G3)foo, $1será G8 = P, $2será G1,G3e $3seria foo.
terdon

7

Há mais de uma maneira de fazer isso:

perl -nle 'print $1 if /\((.*)\)/' file

ou:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

Ele procura o parêntese de abertura, ignora-o e imprime todos os caracteres que não estão entre parênteses próximos.

Requer GNU grep


5

sed 's/^.*(//;s/)$//' /path/to/file

Para dividir isso:

sedé o stream itor ed. 's/^.*(//;s/)$//'é o script que está sendo enviado sed, que é dividido da seguinte forma:

s/^.*(//    substitute nothing for the beginning of any line (`^`) followed by anything up until an open-paren (`(`)
s/)$//      substitute nothing for a close-paren (`)`) followed immediately by the end of a line

1

Uma solução simples de corte:

$ cat test01 | cut -d "(" -f2 | cut -d ")" -f1


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.