terminal Mac: Sed regex โดยแยกส่วนของสตริง


0

ฉันมีสตริงตรงเส้นทางไฟล์

/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt,

ฉันต้องการแยกเส้นทางของโฟลเดอร์

/Users/dengjiangzhou/Documents/源码/198/ที่จะได้รับ

นี่คือสิ่งที่ฉันพยายาม

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@.*\(/.+\)@\1@p' 

/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt 

ผมใช้กลุ่มจับ regex พยายามที่จะจับภาพกลุ่มหนึ่ง/李宏毅-机器学习2017秋季.txtและแทนที่ด้วย,

ดูเหมือนว่ากลุ่มการจับภาพ regex นั้นมีผลต่อการจับคู่ตั้งแต่ต้นจนจบ

แล้วฉันจะได้รับ

/Users/dengjiangzhou/Documents/源码/198

ฉันอ่านSed regex แล้วแยกส่วนของสตริงในเทอร์มินัล Macซ้ำแล้วซ้ำอีก

หวังว่าจะได้รับความช่วยเหลือเพื่อน

อยากที่จะได้รับ/Users/dengjiangzhou/Documents/源码/198/,

/Users/dengjiangzhou/Documents/源码/198 ไม่ดี.

ความคิดที่ดี?

คำตอบ:


1

ความพยายามครั้งแรกไม่ทำงานเนื่องจากการหลบหนี+หายไป

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@.*\(/.\+\)@\1@' 
/李宏毅-机器学习2017秋季.txt 

(Escape สำหรับ metacharacters สามารถหลีกเลี่ยงได้ด้วย-rหรือ-Eตัวเลือกสำหรับ Extended RE)

สิ่งที่คุณต้องการคือส่วน dirname จากนั้นเพียงจัดกลุ่มส่วนแรกของ ER

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@\(.*\)/.*@\1@' 
/Users/dengjiangzhou/Documents/源码/198

ปริมาณในsedโลภหมายความว่าเมื่อคุณขอให้จับคู่ regex อย่าง.*/.*แรก.*จะจับคู่ทุกบรรทัดจนจบเพราะคุณขอให้จับคู่อะไรก็ได้.กับตัวเลขใด ๆ*และ a /คือตัวเลขใด ๆ

แก้ไข - หากคุณต้องการอ่านเกี่ยวกับนิพจน์ทั่วไปและความสนใจลองดู https://www.regular-expressions.info/tutorial.html http://www.grymoire.com/Unix/Sed.html#uh-0


regex ที่สองใช้งานง่ายและดี คุณสามารถบอกฉันทำไมฉันลอง regex แรกในขั้วของฉันผลคือecho "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt" | sed 's@.*\(/.\+\)@\1@' /Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txtคุณไม่ได้แสดงด้านบน
black_pearl

1
@black_pearl บรรทัดคำสั่งนี้คุณโพสต์ในการแสดงความคิดเห็นการทำงานออกเป็นecho "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt" | sed 's@.*\(/.\+\)@\1@' /李宏毅-机器学习2017秋季.txtคุณใช้งานได้ที่ MacOS (ตามชื่อโพสต์) หรือไม่? ถ้าใช่เรากำลังใช้งานเวอร์ชั่นที่แตกต่างกันsedฉันใช้ GNU / Linux ฉันไม่รู้ว่าตัวละครยูนิโค้ดเหล่านั้นทั้งหมดอาจส่งผลกระทบต่อผลลัพธ์หรือไม่ คุณลองใช้กับ ASCII เพื่อดูว่าทำงานได้ตามที่echo "/Users/dengjiangzhou/Documents/198/file2017.txt" | sed 's@.*\(/.\+\)@\1@'คาดไว้หรือไม่/file2017.txt
Paulo

ฉันทำงานใน MacBook ไม่ยัง ผลคือecho "/Users/dengjiangzhou/Documents/198/file2017.txt" | sed 's@.*\(/.\+\)@\1@' /Users/dengjiangzhou/Documents/198/file2017.txtฉันควรอ่านลิงค์ของคุณแล้วลอง
black_pearl

1
มันใช้งานได้หรือไม่ echo "/Users/dengjiangzhou/Documents/198/file2017.txt" | sed -E 's@.*(/.+)@\1@'. ลองใช้สายอักขระ Unicode ด้วยเช่นกันโปรดใช้ด้วย ฉันทำงานใน FreeBSD VirtualBox vm และใช้งานได้ แต่ภาษาไม่ได้รับการกำหนดค่าอย่างเหมาะสม
เปาโล

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