Як замінити останнє виникнення символу в рядку за допомогою 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
Зверніть увагу, це не портативний. Деякі версії, sedщо не належать до GNU , не підтримують відповідність шаблонів. У цьому випадку вам знадобиться щось інше, будь то perl -pne 's/(.*)-/$1 /'рішення або розширення параметрів @ Thor або щось інше.
Адам Кац

звичайно :-) thx ...
Грег

Вам не потрібно уникати цих дужок під час використання одиничних лапок.
jgmjgm

@jgmjgm Ви можете пропустити зворотні нахили, використовуючи розширений регулярний вираз за допомогою sed -r.
jimmij

1
@VinayPotluri Спробуйте sed -r 's/(.*)-(.*)-/\1 \2 /').
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?
Джошпбаррон

7
Для тих, хто має лише базове розуміння регулярних виразів, ця відповідь здається набагато більш доступною. А кого турбує, скільки операцій потрібно, це буде миттєвим для всіх практичних випадків. Тож я б розглядав читабельність щодо якогось довільного правила, щоб використовувати якомога менше операцій.
Псирус

5
@Psirus Я сподіваюся , що це не збирається відкрити банку з хробаками, але ідея використання менших операцій, щоб продемонструвати певний рівень майстерності з менших операцій. Наприклад, відповідь @ Тор показує оцінку функції bashрозширення параметрів, яка добре працює, якщо ОП також використовує bash. Має бути делікатний баланс між читабельністю (до того, що вона є дуже багатослівною) та використанням правильних інструментів, але частіше за все не використовує правильні інструменти.
hjk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.