Cetak string di antara dua tanda kurung


14

Saya punya file dengan baris-baris ini

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

Saya butuh output sebagai

G1,G3
G3,G4
.....

Bagaimana saya bisa melakukannya dengan perintah sed / grep atau menggunakan perl?

Jawaban:


17

Beberapa cara lain:

  • sed

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

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

    atau

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

    atau

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

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

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


1
@satch_boogie, -FAnda dapat memilih karakter apa yang akan digunakan oleh awk untuk membagi baris menjadi bidang. Di sini, saya memberikan kelas karakter ( []) yang terdiri dari tanda kurung buka dan tutup. Jadi itu akan membagi garis (dan seterusnya ). Akibatnya, bidang ke-2 akan menjadi isi tanda kurung. Misalnya, dengan string G8 = P(G1,G3)foo, $1akan G8 = P, $2akan G1,G3dan $3akan foo.
terdon

7

Ada lebih dari satu cara untuk melakukannya:

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

atau:

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

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

Yang mencari tanda kurung buka, abaikan saja, lalu cetak semua karakter tanda kurung non-tutup yang mengikutinya.

Membutuhkan GNU grep


5

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

Untuk memecah ini:

sedadalah stream editor. 's/^.*(//;s/)$//'adalah skrip yang dikirim sed, yang dirinci sebagai berikut:

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

Solusi pemotongan sederhana:

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.