Imprime la cadena entre dos paréntesis

14

Tengo archivo con estas lineas

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

Necesito la salida como

G1,G3
G3,G4
.....

¿Cómo puedo hacerlo con el comando sed / grep o usando perl?

usuario56153
fuente

Respuestas:

17

Algunas otras formas:

  • sed

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

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

    o

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

    o

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

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

    while IFS="()" read a b; do echo "$b"; done < file 
terdon
fuente
le dirá más acerca de cómo funciona el método awk, es fácil de recordar también?
satch_boogie
1
@satch_boogie -Fte permite elegir qué personaje (s) usará awk para dividir la línea en campos. Aquí, le doy una clase de caracteres ( []) que consiste en abrir y cerrar paréntesis. Entonces dividirá la línea una (y otra vez ). Como resultado, el segundo campo será el contenido de los paréntesis. Por ejemplo, con la cadena G8 = P(G1,G3)foo, $1será G8 = P, $2será G1,G3y $3sería foo.
terdon
7

Hay más de una forma de hacerlo:

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

o:

awk 'NR > 1 {print $1}' RS='(' FS=')' file
Cuonglm
fuente
5
grep -oP '\(\K[^)]+' file

Eso busca el paréntesis de apertura, lo ignora, luego imprime todos los caracteres que no están entre paréntesis que siguen.

Requiere GNU grep

Glenn Jackman
fuente
5

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

Para desglosar esto:

sedes el stemblor itor ed. 's/^.*(//;s/)$//'es el script que se envía sed, que se desglosa de la siguiente manera:

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
DopeGhoti
fuente
1

Una solución de corte simple:

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

Sanket
fuente
0
awk -F'(' '{print $NF}' file | sed 's/)//g'
Raid_Master
fuente
2
Mejor usar awk -F"[()]" '{print $2}' filecomo en la respuesta de
terdon