วิธีจับคู่ตัวเลขตามด้วยจุดโดยใช้ sed?


76

ฉันพยายามใช้sedเพื่อแทนที่รูปแบบทั้งหมดด้วยตัวเลขตามด้วยจุด (เช่น3., 355.) ทันทีด้วยสตริงว่าง ดังนั้นฉันลอง:

sed 's/\d+\.//g' file.txt

แต่มันไม่ทำงาน ทำไมถึงเป็นอย่างนั้น?


1
ฉันพบบทความนี้มีประโยชน์มาก
Stphane

คำตอบ:


111

เพราะ sed ไม่ใช่ perl - sed regexes จึงไม่มี\dชวเลข:

sed 's/[[:digit:]]\+\.//g'

sed เอกสารแสดงออกปกติที่นี่


3
นั่นคือถ้าคุณต้องการเลขศูนย์หรือมากกว่า /[[:digit:]]*\. /จะจับคู่สตริงfoo.เพราะคุณอนุญาตให้มีตัวเลขศูนย์ หากคุณต้องการอย่างใดอย่างหนึ่งหรือการใช้งานอื่น ๆ\+ตามที่แสดง
เกล็น Jackman

71

ปัญหาสองประการ:

  1. sed\dไม่สนับสนุน ใช้หรือ[0-9][[:digit:]]

  2. +ต้องถูกแบ็กสแลชเพื่อให้ได้ความหมายพิเศษ: \+.


6
แทนที่จะใช้เครื่องหมายแบ็กสแลช + (ซึ่งไม่ทำงานบน Mac OS X) คุณสามารถใช้ตัวเลือก -E เพื่อinterpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).เศร้าสิ่งนี้ไม่ได้ช่วยแก้ปัญหา \ d ...
gMale

4
@gmale: -Eใช้งานไม่ได้กับ GNU sed แต่ใช้-rแทน
choroba

12
โอเค ... มันดูเหมือนว่าจะเป็นsedเพียงแค่ดูดเมื่อมันมาถึงพกพา ...
iconoclast

@choroba ฉันคิดว่าวันนี้ฉันสับสนตัวเอง ฉันจะลบความคิดเห็นที่มีเสียงดังของฉัน ...
สตีเวนลู

โดยทั่วไปสิ่งที่ผมพยายามที่จะเตือนประชาชนเกี่ยวกับการเป็น: ถ้าคุณไม่ได้ใช้ regex ขยาย ( -Eบน BSD sed และ-rบน GNU sed) ใน BSD sed, ค่า+มิได้\+(เช่นเดียวกับ?) จะทำงานที่ทั้งหมดในขณะที่ใน GNU sed คุณสามารถ ให้พวกเขาทำงานด้วยแบ็กสแลช ดังนั้นคำแนะนำทั่วไปในการใช้ regex เพิ่มเติมในการเขียนสคริปต์
Steven Lu

3

หน้า man sed อ้างอิงหน้า re_format มันทำให้ความแตกต่าง 2: (1) ล้าสมัยเมื่อเทียบกับการแสดงออกปกติขยาย; (2) นิพจน์ทั่วไปที่ไม่ได้รับการปรับปรุงเมื่อเทียบกับที่ปรับปรุงแล้ว ชุดค่าผสมทั้ง 4 เป็นไปได้ มีการสนับสนุนสำหรับทั้งล้าสมัยและขยาย แต่ในกรณีใดกรณีหนึ่งสำหรับการไม่ปรับปรุง ตัวดำเนินการ \ d เป็นคุณลักษณะของนิพจน์ทั่วไปที่ปรับปรุงแล้วดังนั้นจึงไม่รองรับโดย sed

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