แตกชื่อไฟล์ฐานจาก URL โดยใช้ bash


15
url=http://www.foo.bar/file.ext; echo ${url##/*}

ฉันคาดว่ารหัสนี้จะพิมพ์file.extแต่พิมพ์ URL ทั้งหมด ทำไม? ฉันจะแยกชื่อไฟล์ได้อย่างไร


โอเค obv ฉันคาดหวังสิ่งผิดปกติที่จะเกิดขึ้น ดีฉันต้องการที่จะแยก file.ext
ManuelSchneid3r

คุณพยายามที่จะตัดปลายออกจากสาย? ลองdirname $urlดู grep -o 'http://[^/]*' <<<$urlหรือ
เควิน

คำตอบ:


28

เพราะคำต้องตรงกับสายที่จะตัดแต่ง ควรมีลักษณะดังนี้:

url="http://www.foo.bar/file.ext"; echo "${url##*/}"

ขอบคุณ Derobert คุณพาฉันไปในทิศทางที่ถูกต้อง


ฮ่าฮ่าพวกเราทั้งคู่ตระหนักดีว่าในเวลาเดียวกัน ดีใจที่ได้ช่วยเหลือ
Derobert

10

วิธีอ้างอิง manpage:

${parameter##word}
   Remove matching prefix pattern.  The word is expanded to produce
   a pattern just as in pathname expansion.  If the pattern matches
   the  beginning of the value of parameter, […]

/*ไม่ตรงกับจุดเริ่มต้นเพราะ URL ของคุณเริ่มต้นด้วยไม่ได้h/

วิธีที่น่ารำคาญที่จะทำสิ่งที่คุณกำลังมองหา (ตามความคิดเห็นของคุณ) echo "$url" | rev | cut -d / -f 1 | revเป็น แต่แน่นอนว่าจะให้ผลลัพธ์ที่น่าสนใจสำหรับ URL ที่ลงท้ายด้วยเครื่องหมายทับ

อีกวิธีในการทำสิ่งที่คุณต้องการอาจใช้รูปแบบ*/แทน


ดีใจที่คุณให้คำอธิบายเกี่ยวกับสิ่งที่ต้องทำและคำพูดจาก manpage นั้นเป็นข้อดีอย่างมาก! นั่นช่วยฉันได้มาก! ขอบคุณอีกครั้ง! :)
Fadi

6

basename(1) ทำงานกับ URL ได้เช่นกันดังนั้นคุณสามารถทำได้:

url=http://www.foo.bar/file.ext; basename $url

4

ดูเพิ่มเติม: Bash Extended Globbingแม้ว่าในกรณีนี้ glob แบบขยายไม่จำเป็น

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

เอาท์พุท: file.ext

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