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
-F
cho 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
, $1
sẽ G8 = P
, $2
sẽ G1,G3
và $3
sẽ 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:
sed
là s
tream ed
itor. '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}' file
như trong câu trả lời của