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?
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:
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 -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.
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
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
awk -F'(' '{print $NF}' file | sed 's/)//g'
awk -F"[()]" '{print $2}' filenhư trong câu trả lời của