กรองอินพุตด้วย sed (regex)


1

ฉันมีปัญหากับ sed ไม่ได้คืนสิ่งที่ฉันคาดหวังเมื่อใช้รูปแบบ regex เพื่อล้างผลลัพธ์บางอย่างจากแบบสอบถาม mysql

mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p'

แบบสอบถามส่งคืนกลุ่มของแถวเช่น:

| /media/M/W/lmt_MWS04_8.png    |
| /media/M/W/lmt_MWS02_11.png   |

เมื่อฉันไพพ์ผ่านคำสั่ง sed ที่ระบุไว้ด้านบนมันจะส่งคืนสิ่งนี้:

//M/W/lmt_MWS04_8.png
//M/W/lmt_MWS02_11.png

"สื่อ" ไปไหน เหตุใดจึงลบส่วนของสตริงของฉันแบบสุ่ม

ไม่มีใครรู้วิธีแก้ไข regex ของฉันหรือไม่


"สื่อ" หายไปเพราะมันถูกจับคู่โดย[^\/]+ส่วนของ regex ของคุณซึ่งไม่รวมอยู่ในผลลัพธ์ของคุณ เราไม่สามารถแก้ไข regex ของคุณได้หากเราไม่ทราบว่าคุณกำลังพยายามทำอะไร คุณกำลังพยายามที่จะตัดช่องว่าง?
wingedsubmariner

คำตอบ:


3

ไม่จำเป็นต้องมีปัญหาใด ๆ ปัญหาที่แท้จริงคือคุณกำลังใช้เอาต์พุตที่น่าสนใจของ mysql ที่มีไว้สำหรับมนุษย์ไม่ใช่การบริโภคแบบอัตโนมัติ นี่เป็นงานง่ายที่ mysql สามารถทำได้มากกว่า

mysql -N -s -r -uroot -p -e 'SELECT `path` FROM db.media_gallery'

จะกลับมา:

/media/M/W/lmt_MWS04_8.png
/media/M/W/lmt_MWS02_11.png

จาก 'man mysql':

--skip-column-names, -N
--silent, -s
--raw, -r

0

"สื่อ" ตรงกับ "[^ /] +" ดังนั้นจึงถูกแทนที่ด้วยเนื้อหาในวงเล็บ หากคุณต้องการคุณจะต้องเปิดวงเล็บก่อนส่วนคำสั่ง regex

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