พิมพ์สตริงระหว่างวงเล็บสองอัน


14

ฉันมีไฟล์ที่มีบรรทัดเหล่านี้

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?

คำตอบ:


18

อีกสองสามวิธี:

  • 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 

คุณจะบอกเพิ่มเติมเกี่ยวกับวิธีการทำงานของ awk อย่างไรมันง่ายต่อการจดจำเช่นกัน
satch_boogie

1
@satch_boogie -Fให้คุณเลือกอักขระที่จะใช้ awk เพื่อแยกบรรทัดออกเป็นฟิลด์ ที่นี่ฉันจะให้คลาสตัวละคร ( []) ประกอบด้วยวงเล็บเปิดและปิด ดังนั้นมันจะแยกสายบนและ( )ดังนั้นฟิลด์ที่ 2 จะเป็นเนื้อหาของวงเล็บ เช่นกับสตริงG8 = P(G1,G3)foo, $1จะG8 = P, $2จะเป็นG1,G3และจะเป็น$3 foo
terdon

7

มีมากกว่าหนึ่งวิธีที่จะทำ:

perl -nle 'print $1 if /\((.*)\)/' file

หรือ:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

ที่มองหาวงเล็บเปิดไม่สนใจแล้วพิมพ์อักขระที่ไม่ใช่วงเล็บปิดทั้งหมดที่ตามมา

ต้องใช้ GNU grep


5

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.