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

Ответы:

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
jimmij
источник
2
Обратите внимание, это не портативный. Некоторые не-GNU версии sedне поддерживают сопоставление с образцом. В этом случае вам понадобится что-то еще, будь то perl -pne 's/(.*)-/$1 /'решение для расширения параметров @ Thor или что-то еще.
Адам Кац
конечно :-) спасибо ...
Грег
Вам не нужно выходить за эти скобки при использовании одинарных кавычек.
jgmjgm
@jgmjgm Вы можете опустить обратную косую черту, используя расширенное регулярное выражение с sed -r.
Джимми
1
@VinayPotluri Попробуй sed -r 's/(.*)-(.*)-/\1 \2 /').
Джимми
27

Вы также можете справиться с этим с помощью расширения параметров bash :

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

Выход:

swp-RedHat-Linux-OS-5.5.0.0 03
Тор
источник
Очень креативно, люблю этот ответ
dpritch
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