ลบอักขระตัวสุดท้ายในคำ แต่ถ้าตัวละครนั้นอยู่ในนั้น - ในทุบตี


13

วิธีลบตัวอักขระสุดท้ายเฉพาะเมื่อมันอยู่ที่นั่น?

การป้อนข้อมูล:

OpenOffice.org/m
openOffice.org/ozm
Pers
PFG
ฟิล
ศ.
รับผิดชอบ
Roonstr./m
roonstr./ozm

ผลลัพธ์ที่ต้องการ:

OpenOffice.org
openOffice.org
Pers
PFG
ฟิล
ศ
รับผิดชอบ
Roonstr
roonstr

ฉันเข้าใจแล้วจนถึงจุดที่เหลือเท่านั้น แต่น่าเสียดายที่คำสั่ง sed ล่าสุดยังลบตัวอักษรgด้วย: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

คำตอบ:


13

คุณเพียงแค่ต้องหลบหนีจุดในsedคำสั่งของคุณและทุกอย่างจะดี แบบนี้:

sed 's/\.$//'

เพราะในกรณีที่คุณไม่หนีมัน.$จะจับคู่กับตัวละครใด ๆ ที่ส่วนท้ายของสตริง

นอกจากนี้คุณสามารถใส่ทั้งหมดของคุณsed+ grep+ cutเข้าเพียงหนึ่งsed:

sed 's=/[^/]*$==;s/\.$//' filename

เยี่ยมมากขอบคุณใช้งานได้! :) ฉันใช้พจนานุกรมที่มีมากกว่า 300 บรรทัดดังนั้นนี่คือเหตุผลที่ฉันใช้ grep "\" เพื่อให้ได้เฉพาะคำที่มีจุดอยู่ที่นั่น
removeelastdotonlyifitsthere

sed sed -n '/\./{s=/[^/]*$==;s/\.$//;p}ยังสามารถทำมันได้ด้วยบเช่นนี้ อย่างไรก็ตามgrep+ sedจะทำงานได้นานกว่าหนึ่งsedครั้ง
เร่ง

หากสามารถทำได้ด้วยหนึ่ง sed มันจะดีแม้ว่า วิธีการใช้คำสั่ง sed ครั้งสุดท้ายของคุณ?
removeelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter.O

ขอบคุณตอนนี้ฉันไม่จำเป็นต้องตัด แต่ grep ยังอยู่ที่นั่น สิ่งที่เทียบเท่าคำสั่ง pipp grep ของฉันจะลบ grep ไปถ้าเป็นไปได้มันจะดี "นอกจากนี้คุณสามารถใส่ sed + grep + ทั้งหมดของคุณลงใน sed เดียวได้" ไม่ทำงานสำหรับฉันพิมพ์คำทั้งหมดหรือไม่
removeelastdotonlyifitsthere

1

การลบอักขระเฉพาะเมื่อมีคำอธิบายของการขยายพารามิเตอร์เท่านั้น

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

จุดไม่ได้พิเศษในกรณีนี้ (จุดเป็นพิเศษใน regex)

รูปแบบอื่นสามารถลบได้ด้วย%/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

หากต้องการลบทั้งสอง:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

แน่นอนว่าการทำงานกับไฟล์ต้นฉบับจะใช้งานไฟล์ได้เร็วกว่า
อย่าลืมอ้างจุด (เพื่อให้ตรงกับอักษรจริงๆมิฉะนั้นมันหมายถึง: ตัวละครใด ๆ )

 $ sed 's,/.*,,;s,\.$,,' file

นี่ควรเป็นคำตอบที่ยอมรับได้ ต้องการ upvotes มากขึ้น
David Parks

0

เพียงแค่เปลี่ยนการแสดงออกปกติของคุณเล็กน้อย: เพื่อหลบหนี. และคุณไม่ต้องการgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.