ฉันจะแทนที่การเกิดขึ้นครั้งสุดท้ายของอักขระในสตริงโดยใช้ sed ได้อย่างไร


31

ฉันจะแทนที่การเกิดขึ้นครั้งสุดท้ายของ "-" ในสตริงที่มีช่องว่างได้sedอย่างไร?

ตัวอย่างเช่น:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

แต่ฉันต้องการได้ผลลัพธ์ต่อไปนี้ (แทนที่เครื่องหมายขีดคั่นสุดท้าย [“ -“] ด้วยช่องว่าง)

swp-RedHat-Linux-OS-5.5.0.0 03

คำตอบ:


48

คุณสามารถทำได้ด้วยซิงเกิลsed:

sed 's/\(.*\)-/\1 /'

หรือใช้การแสดงออกปกติเพิ่มเติม:

sed -r 's/(.*)-/\1 /'

ประเด็นก็คือว่าsedเป็นโลภมากจึงตรงกับตัวละครหลายคนก่อนที่จะเป็นไปได้รวมทั้งคนอื่น ๆ--

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03

2
หมายเหตุนี่ไม่ใช่พกพา รุ่นที่ไม่ใช่ GNU บางรุ่นsedไม่รองรับรูปแบบการจับคู่ ในกรณีนี้คุณจะต้องใช้อย่างอื่นไม่ว่าจะเป็นperl -pne 's/(.*)-/$1 /'โซลูชันการขยายตัวพารามิเตอร์ของ @ Thor หรืออย่างอื่น
Adam Katz

แน่นอน :-) ขอบคุณ ...
เกร็ก

คุณไม่จำเป็นต้องหลบเลี่ยงวงเล็บเหล่านั้นเมื่อใช้เครื่องหมายคำพูดเดี่ยว
jgmjgm

@jgmjgm sed -rคุณสามารถละเว้นเครื่องหมายโดยการใช้ขยายการแสดงออกปกติด้วย
jimmij

1
sed -r 's/(.*)-(.*)-/\1 \2 /')ลอง @VinayPotluri
jimmij


11

บางอย่างเช่นนี้ใช้ได้กับฉันแม้ว่าฉันจะแน่ใจว่ามีวิธีที่ดีกว่า

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03

นี่มันแย่ ... เลวร้ายธรรมดา ทำไมการทำงาน 4 อย่างเมื่อคุณทำได้ 2
Joshpbarron

7
สำหรับผู้ที่มีความเข้าใจพื้นฐานเกี่ยวกับการแสดงออกปกติคำตอบนี้ดูเหมือนจะเข้าถึงได้มากขึ้น และใครสนใจว่าต้องใช้การปฏิบัติการกี่ครั้งสิ่งนี้จะเกิดขึ้นทันทีในทุกกรณี ดังนั้นฉันจะพิจารณาความสามารถในการอ่านกฎเกณฑ์บางอย่างเพื่อใช้การดำเนินการเพียงเล็กน้อยเท่าที่จะทำได้
Psirus

5
@Psirus ฉันหวังว่านี่จะไม่เปิดกระป๋องเวิร์ม แต่แนวคิดของการใช้การดำเนินการที่น้อยกว่าคือการแสดงระดับความเชี่ยวชาญในการปฏิบัติการที่น้อยลง ตัวอย่างเช่นคำตอบของ @ Thor แสดงถึงการชื่นชมbashคุณลักษณะการขยายพารามิเตอร์ซึ่งทำงานได้ดีถ้า OP ใช้bashเช่นกัน จะมีความสมดุลระหว่างการอ่าน (จนถึงจุดที่ละเอียดมาก) และการใช้เครื่องมือที่เหมาะสม แต่บ่อยครั้งกว่าการไม่ใช้เครื่องมือที่เหมาะสม
hjk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.