Imprimer la chaîne entre deux parenthèses

14

J'ai un fichier avec ces lignes

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

J'ai besoin de la sortie comme

G1,G3
G3,G4
.....

Comment puis-je le faire avec la commande sed / grep ou en utilisant perl?

user56153
la source

Réponses:

18

Quelques autres façons:

  • 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 
  • coquille

    while IFS="()" read a b; do echo "$b"; done < file 
terdon
la source
en diriez-vous plus sur le fonctionnement de la méthode awk?, c'est aussi facile à retenir
satch_boogie
1
@satch_boogie the -Fvous permet de choisir quel (s) personnage (s) awk utilisera pour diviser la ligne en champs. Ici, je lui donne une classe de caractères ( []) composée de parenthèses ouvrantes et fermantes. Il va donc diviser la ligne (indéfiniment ). En conséquence, le 2ème champ sera le contenu des parenthèses. Par exemple, avec la chaîne G8 = P(G1,G3)foo, $1sera G8 = P, $2sera G1,G3et $3serait foo.
terdon
7

Il y a plus d'une façon de le faire:

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

ou:

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

Cela recherche la parenthèse ouvrante, l'ignore, puis imprime tous les caractères non parenthèses fermés qui suivent.

Nécessite GNU grep

glenn jackman
la source
5

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

Pour décomposer cela:

sedest le stream itor ed. 's/^.*(//;s/)$//'est le script envoyé sed, qui se décompose comme suit:

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
la source
1

Une solution de coupe simple:

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

Sanket
la source
0
awk -F'(' '{print $NF}' file | sed 's/)//g'
Raid_Master
la source
2
Mieux vaut utiliser awk -F"[()]" '{print $2}' filecomme dans la réponse de
terdon