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,G3và $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:

sedlà stream 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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.