grep: regex สำหรับจับคู่สิ่งที่อยู่ระหว่างวงเล็บเท่านั้น


21

ฉันจะจับคู่คำระหว่างวงเล็บได้อย่างไร

อินพุต: this is (test.com)

ความปรารถนาเอาท์พุท: test.com


1
คุณกำลังมองหา regex 'grep' เพื่อให้ตรงกันหรือเช่นคำสั่ง 'sed' ทดแทนเพื่อสร้างเอาต์พุตของคุณแสดงหรือไม่
rickhg12hs

คำตอบ:


28

ต่อไปนี้เป็นตัวเลือกไม่กี่ทั้งหมดที่พิมพ์ออกมาที่ต้องการ:

  1. ใช้grepกับ-oธง (พิมพ์เฉพาะที่ตรงกับส่วนหนึ่งของสาย) และนิพจน์ปกติ Perl เข้ากันได้ ( -P) ที่สามารถทำlookarounds :

    printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'
    

    regex นั้นอาจต้องอธิบาย:

    • (?<=\(): นี่คือlookbehind บวกรูปแบบทั่วไป(?<=foo)barและที่จะตรงกับทุกกรณีของหลังด้านขวาพบbar fooในกรณีนี้เรากำลังมองหาวงเล็บเปิดดังนั้นเราใช้\(เพื่อหนีมัน

    • (?=\)): นี่คือlookahead เชิงบวกและตรงกับวงเล็บปิด

  2. -oตัวเลือกที่จะgrepทำให้เกิดการพิมพ์เฉพาะส่วนที่จับคู่ของสายการใด ๆ เพื่อให้เรามองหาสิ่งที่อยู่ในวงเล็บแล้วลบพวกเขาด้วยsed:

    printf "this is (test.com)\n" | grep -o '(.*)' | sed 's/[()]//g'
    
  3. แยกวิเคราะห์สิ่งทั้งหมดด้วย Perl:

    printf "this is (test.com)\n" | perl -pe 's/.*\((.+?)\)/$1/'
    
  4. แยกวิเคราะห์สิ่งทั้งหมดด้วยsed:

    printf "this is (test.com)\n" | sed 's/.*(\(.*\))/\1/'
    

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