Drucken Sie die Zeichenfolge zwischen zwei Klammern

14

Ich habe eine Akte mit diesen Zeilen

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

Ich brauche die Ausgabe als

G1,G3
G3,G4
.....

Wie kann ich das mit sed / grep oder perl machen?

user56153
quelle

Antworten:

17

Ein paar andere Möglichkeiten:

  • sed

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

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

    oder

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

    oder

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

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

    while IFS="()" read a b; do echo "$b"; done < file 
terdon
quelle
Würden
1
@satch_boogie Mit dieser Option -Fkönnen Sie auswählen, welche Zeichen awk verwenden soll, um die Zeile in Felder aufzuteilen. Hier gebe ich ihm eine Zeichenklasse ( []), die aus öffnenden und schließenden Klammern besteht. So wird es die Linie weiter (und weiter teilen ). Infolgedessen ist das 2. Feld der Inhalt der Klammern. Zum Beispiel mit der Zeichenfolge G8 = P(G1,G3)foo, $1wird G8 = P, $2wird sein G1,G3und $3wäre foo.
Terdon
7

Es gibt mehr als eine Möglichkeit, dies zu tun:

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

oder:

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

Das sucht nach der öffnenden Klammer, ignoriert sie und druckt dann alle nicht in Klammern gesetzten Zeichen, die folgen.

Benötigt GNU grep

Glenn Jackman
quelle
5

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

Um dies aufzuschlüsseln:

sedist der sTream editor. 's/^.*(//;s/)$//'wird das Skript gesendet sed, das sich wie folgt zusammensetzt:

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
quelle
1

Eine einfache Schnittlösung:

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

Sanket
quelle
0
awk -F'(' '{print $NF}' file | sed 's/)//g'
Raid_Master
quelle
2
Besser zu verwenden awk -F"[()]" '{print $2}' fileals in Terdons Antwort
αғsнιη