Вопрос

Я пишу сценарий оболочки (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, я использую эту страницу,

http://sed.sourceforge.net/sed1line.txt

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top