In chuỗi giữa hai dấu ngoặc đơn


14

Tôi có tập tin với những dòng này

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

Tôi cần đầu ra như

G1,G3
G3,G4
.....

Làm thế nào tôi có thể làm điều đó với lệnh sed / grep hoặc sử dụng perl?

Câu trả lời:


17

Một vài cách khác:

  • sed

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

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

    hoặc là

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

    hoặc là

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

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

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

bạn có thể nói rõ hơn về cách thức hoạt động của phương thức awk không?, nó cũng dễ nhớ
satch_boogie

1
@satch_boogie -Fcho phép bạn chọn nhân vật mà awk sẽ sử dụng để phân chia dòng thành các trường. Ở đây, tôi cho nó một lớp ký tự ( []) bao gồm các dấu ngoặc mở và đóng. Vì vậy, nó sẽ phân chia dòng trên (và trên ). Do đó, trường thứ 2 sẽ là nội dung của dấu ngoặc đơn. Ví dụ, với chuỗi G8 = P(G1,G3)foo, $1sẽ G8 = P, $2sẽ G1,G3$3sẽ foo.
terdon

7

Có nhiều hơn một cách để làm điều đó:

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

hoặc là:

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

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

Điều đó tìm kiếm dấu ngoặc đơn mở, bỏ qua nó, sau đó in tất cả các ký tự không đóng ngoặc theo sau.

Yêu cầu GNU grep


5

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

Để phá vỡ điều này:

sedstream editor. 's/^.*(//;s/)$//'là tập lệnh đang được gửi tới sed, nó bị hỏng như sau:

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

Một giải pháp cắt đơn giản:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.