Как заменить только последнее вхождение "-" в строке пробелом sed
?
Например:
echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03
но я хочу получить следующий вывод (заменив последний дефис [«-«] пробелом)
swp-RedHat-Linux-OS-5.5.0.0 03
Как заменить только последнее вхождение "-" в строке пробелом sed
?
Например:
echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03
но я хочу получить следующий вывод (заменив последний дефис [«-«] пробелом)
swp-RedHat-Linux-OS-5.5.0.0 03
Ответы:
Вы можете сделать это синглом 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
sed -r
.
sed -r 's/(.*)-(.*)-/\1 \2 /')
.
Вы также можете справиться с этим с помощью расширения параметров bash :
s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}
Выход:
swp-RedHat-Linux-OS-5.5.0.0 03
Нечто подобное сработало для меня, хотя я уверен, что есть лучшие способы
echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
bash
расширения параметров, которая хорошо работает, если OP также использует bash
. Будет достигнут тонкий баланс между удобочитаемостью (вплоть до очень многословного) и использованием правильных инструментов, но чаще всего преобладают правильные инструменты.
sed
не поддерживают сопоставление с образцом. В этом случае вам понадобится что-то еще, будь тоperl -pne 's/(.*)-/$1 /'
решение для расширения параметров @ Thor или что-то еще.