Поиск и замена в оболочке
Вопрос
Я пишу сценарий оболочки (bash) и пытаюсь найти простой способ выполнить простую задачу.
У меня есть некоторая строка в переменной.Я не знаю, уместно ли это, но оно может содержать пробелы, новые строки, потому что на самом деле эта строка является содержимым целого текстового файла.
Я хочу заменить последнее вхождение определенной подстроки чем-то другим.Возможно, я мог бы использовать для этого регулярное выражение, но есть два момента, которые меня смущают:
- Мне нужно соответствовать с конца, а не с самого начала
- подстрока, которую я хочу отсканировать, является фиксированной, а не переменной.
Решение
- для усечения в начале:
${var#pattern}
- усечение в конце
${var%pattern}
${var/pattern/repl}
для общей замены
шаблоны представляют собой расширение стиля 'filename', и последний из них может иметь префикс #
или %
совпадать только в начале или в конце (соответственно)
все это есть на (длинной) странице руководства bash.ознакомьтесь с главой "Расширение параметров".
Другие советы
выражение amn , подобное этому
s/match string here$/new string/
должно сработать - s означает sustitute, / разбить команду, а $ - это маркер конца строки.Вы можете попробовать это в vi, чтобы посмотреть, делает ли это то, что вам нужно.
Я бы поискал справочные страницы для awk или sed.
Ответ Хавьера зависит от оболочки и не будет работать во всех оболочках.
Ответы sed, на которые ссылались Мртелли и epochwolf, являются неполными и должны выглядеть примерно так:
MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`
Причина, по которой это работает без необходимости использовать $ для обозначения конца, заключается в том, что первое '.*' является жадным и попытается собрать как можно больше, позволяя остальной части регулярного выражения быть true.
Эта команда sed должна нормально работать в любом используемом контексте командной строки.
Обычно, когда я застреваю с Sed, я использую эту страницу,