ใช้ regex ที่เข้ากันได้กับ Perl กับ GNU grep -P


10

ฉันใช้ regex นี้(?<=\[')[^,]*กับไฟล์ที่มีบรรทัดต่อไปนี้disk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

ฉันต้องการที่จะกลับมา OVS/sdasd/asdasd/asdasd/something.img

ฉันจะใช้grepเพื่อทำให้มันทำงานได้อย่างไร

ฉันได้ลองแล้วgrep -P "(?<=\[')[^,]*"แต่มันกลับมาทั้งบรรทัด

คำตอบ:


14

เพิ่ม-oสวิตช์เพื่อให้grepเฉพาะสิ่งที่ตรงกับรูปแบบที่คุณต้องการสำหรับ:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

6

นอกจากนี้คุณยังสามารถใช้sedโดยไม่ได้รับการยืนยัน LookAround สำหรับการพกพามากขึ้น ( -oอาจไม่สามารถใช้ได้สำหรับคุณgrep):

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

สังเกตการใช้แบ็กสแลช "แปลก" ที่นี่ เป็นเพราะความจริงที่ว่าsedใช้ BREs เป็นค่าเริ่มต้น (ดูคำถามนี้ )

พูดถึงเรื่องการพกพาทำไมไม่ใช้แค่ Perl?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

2

@slm ได้ให้คำตอบที่ยอมรับแล้ว นี่คือตัวเลือกเพิ่มเติมไม่กี่:

ใช้awkและ'เป็นตัวคั่นฟิลด์ (สมมติว่าทุกบรรทัดมีรูปแบบเหมือนกัน):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

ทำสิ่งทั้งหมดใน Perl:

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

ใช้ regex ที่ง่ายขึ้นและแยกผลลัพธ์:

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.