Làm cách nào để thay thế lần xuất hiện cuối cùng của một ký tự trong chuỗi bằng sed?


31

Làm cách nào để chỉ thay thế lần xuất hiện cuối cùng của "-" trong một chuỗi bằng khoảng trắng bằng cách sử dụng sed?

Ví dụ:

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

nhưng tôi muốn nhận đầu ra sau (thay thế dấu gạch nối cuối cùng [Rời - Nâng cấp] bằng dấu cách)

swp-RedHat-Linux-OS-5.5.0.0 03

Câu trả lời:


48

Bạn có thể làm điều đó với đơn sed:

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

hoặc, sử dụng biểu thức chính quy mở rộng:

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

Vấn đề sedlà rất tham lam, vì vậy phù hợp với càng nhiều nhân vật trước -càng tốt, bao gồm cả những nhân vật khác -.

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

2
Lưu ý, đây không phải là di động. Một số phiên bản không phải của GNU sedkhông hỗ trợ khớp mẫu. Trong trường hợp đó, bạn sẽ cần một cái gì đó khác, là perl -pne 's/(.*)-/$1 /'giải pháp mở rộng tham số của @ Thor hoặc một cái gì đó khác.
Adam Katz

tất nhiên :-) thx ...
Greg

Bạn không cần phải thoát các dấu ngoặc đó khi sử dụng dấu ngoặc đơn.
jgmjgm

@jgmjgm Bạn có thể bỏ qua dấu gạch chéo ngược bằng cách sử dụng biểu thức chính quy mở rộng với sed -r.
jimmij

1
@VinayPotluri Hãy thử sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij

27

Bạn cũng có thể xử lý việc này với mở rộng tham số bash :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Đầu ra:

swp-RedHat-Linux-OS-5.5.0.0 03

Rất sáng tạo, thích câu trả lời này
dpritch

11

Một cái gì đó như thế này làm việc cho tôi, mặc dù tôi chắc chắn có những cách tốt hơn

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

Điều này thật tệ ... thật tệ. Tại sao 4 thao tác khi bạn có thể làm 2?
Joshpbarron 3/03/2015

7
Đối với một người chỉ có hiểu biết cơ bản về biểu thức chính quy, câu trả lời này có vẻ dễ tiếp cận hơn nhiều. Và ai quan tâm có bao nhiêu thao tác, điều này sẽ là tức thời cho tất cả các trường hợp thực tế. Vì vậy, tôi sẽ xem xét khả năng đọc qua một số quy tắc tùy ý để sử dụng càng ít thao tác càng tốt.
Psirus 3/03/2015

5
@Psirus Tôi hy vọng điều này sẽ không mở ra một con giun, nhưng ý tưởng sử dụng các hoạt động ít hơn là để thể hiện một mức độ thành thạo nhất định của các hoạt động ít hơn . Ví dụ: câu trả lời của @ Thor cho thấy sự đánh giá cao bashtính năng mở rộng tham số, hoạt động tốt nếu OP cũng đang sử dụng bash. Sẽ có một sự cân bằng tinh tế giữa khả năng đọc (đến mức rất dài dòng) và sử dụng đúng công cụ, nhưng thường xuyên hơn là không sử dụng đúng công cụ.
hjk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.