ฉันมีไฟล์ที่มีบรรทัดเหล่านี้
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เป็นstream edItor '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'