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?

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 


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

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


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

1

Eine einfache Schnittlösung:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.