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?
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?
Respuestas:
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
-F
te 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
, $1
será G8 = P
, $2
será G1,G3
y $3
sería foo
.
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
sed 's/^.*(//;s/)$//' /path/to/file
Para desglosar esto:
sed
es el s
temblor 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
awk -F'(' '{print $NF}' file | sed 's/)//g'
awk -F"[()]" '{print $2}' file
como en la respuesta de