Stampa la stringa tra due parentesi


14

Ho un file con queste righe

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

Ho bisogno dell'output come

G1,G3
G3,G4
.....

Come posso farlo con il comando sed / grep o usando perl?

Risposte:


17

Alcuni altri modi:

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

    while IFS="()" read a b; do echo "$b"; done < file 

vorresti dire di più su come funziona il metodo awk?, è anche facile da ricordare
satch_boogie

1
@satch_boogie -Fti permette di scegliere quale personaggio (i) awk utilizzerà per dividere la linea in campi. Qui, gli sto dando una classe di caratteri ( []) che consiste nell'aprire e chiudere le parentesi. Quindi dividerà la linea ancora (e ancora ). Di conseguenza, il 2 ° campo sarà il contenuto tra parentesi. Ad esempio, con la stringa G8 = P(G1,G3)foo, $1sarà G8 = P, $2sarà G1,G3e $3sarebbe foo.
terdon

7

C'è più di un modo per farlo:

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

o:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

Che cerca la parentesi aperta, la ignora, quindi stampa tutti i caratteri non parentesi che seguono.

Richiede GNU grep


5

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

Per scomporlo:

sedè l' surlo ed. 's/^.*(//;s/)$//'è lo script a cui viene inviato sed, suddiviso come segue:

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

Una soluzione di taglio semplice:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.