ฉันมีไฟล์ที่มีบรรทัดเหล่านี้
G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)
ฉันต้องการผลลัพธ์เป็น
G1,G3
G3,G4
.....
ฉันจะทำอย่างไรกับคำสั่ง sed / grep หรือใช้ Perl?
ฉันมีไฟล์ที่มีบรรทัดเหล่านี้
G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)
ฉันต้องการผลลัพธ์เป็น
G1,G3
G3,G4
.....
ฉันจะทำอย่างไรกับคำสั่ง sed / grep หรือใช้ Perl?
คำตอบ:
อีกสองสามวิธี:
sed
sed 's/.*(\(.*\))/\1/' file
Perl
perl -pe 's/.*\((.*)\)/$1/' file
หรือ
perl -lanF"[()]" -e 'print $F[1]' file
หรือ
perl -pe 's/.*\((.+?)\).*/$1/;' file
awk
awk -F"[()]" '{print $2}' file
เปลือก
while IFS="()" read a b; do echo "$b"; done < file
-F
ให้คุณเลือกอักขระที่จะใช้ awk เพื่อแยกบรรทัดออกเป็นฟิลด์ ที่นี่ฉันจะให้คลาสตัวละคร ( []
) ประกอบด้วยวงเล็บเปิดและปิด ดังนั้นมันจะแยกสายบนและ(
)
ดังนั้นฟิลด์ที่ 2 จะเป็นเนื้อหาของวงเล็บ เช่นกับสตริงG8 = P(G1,G3)foo
, $1
จะG8 = P
, $2
จะเป็นG1,G3
และจะเป็น$3
foo
มีมากกว่าหนึ่งวิธีที่จะทำ:
perl -nle 'print $1 if /\((.*)\)/' file
หรือ:
awk 'NR > 1 {print $1}' RS='(' FS=')' file
grep -oP '\(\K[^)]+' file
ที่มองหาวงเล็บเปิดไม่สนใจแล้วพิมพ์อักขระที่ไม่ใช่วงเล็บปิดทั้งหมดที่ตามมา
ต้องใช้ GNU grep
sed 's/^.*(//;s/)$//' /path/to/file
หากต้องการทำลายสิ่งนี้:
sed
เป็นs
tream ed
Itor 's/^.*(//;s/)$//'
เป็นสคริปต์ที่ถูกส่งไปยังsed
ซึ่งแบ่งลงดังต่อไปนี้:
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
วิธีการตัดแบบง่าย:
$ cat test01 | cut -d "(" -f2 | cut -d ")" -f1
awk -F'(' '{print $NF}' file | sed 's/)//g'