Как заменить последнее вхождение символа в строку с помощью 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 или что-то еще.
Адам Кац

конечно :-) спасибо ...
Грег

Вам не нужно выходить за эти скобки при использовании одинарных кавычек.
jgmjgm

@jgmjgm Вы можете опустить обратную косую черту, используя расширенное регулярное выражение с sed -r.
Джимми

1
@VinayPotluri Попробуй sed -r 's/(.*)-(.*)-/\1 \2 /').
Джимми


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.