Поиск и замена в Shell - PullRequest
       28

Поиск и замена в Shell

1 голос
/ 07 февраля 2009

Я пишу сценарий оболочки (bash) и пытаюсь найти простой способ выполнить простую задачу.

У меня есть некоторая строка в переменной. Я не знаю, относится ли это к делу, но оно может содержать пробелы, переводы строк, потому что фактически эта строка является содержимым всего текстового файла.

Я хочу заменить последнее вхождение определенной подстроки чем-то другим. Возможно, я мог бы использовать для этого регулярное выражение, но меня смущают два момента:

  • Мне нужно совпадать с конца, а не с начала
  • подстрока, по которой я хочу сканировать, является фиксированной, а не переменной.

Ответы [ 5 ]

4 голосов
/ 07 февраля 2009
  • для усечения в начале: ${var#pattern}
  • усечение в конце ${var%pattern}
  • ${var/pattern/repl} для общей замены

шаблоны являются расширением стиля 'filename', и последний может иметь префикс # или %, чтобы соответствовать только в начале или в конце (соответственно)

это все на (длинной) странице руководства bash. см. главу «Расширение параметров».

1 голос
/ 07 февраля 2009

выражение amn как это

s/match string here$/new string/

должен сделать трюк - s для sustitute, / разбить команду, а $ - маркер конца строки. Вы можете попробовать это в vi, чтобы увидеть, делает ли он то, что вам нужно.

0 голосов
/ 28 апреля 2009

Обычно, когда я застреваю с Седом, я использую эту страницу,

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

0 голосов
/ 10 февраля 2009

Ответ Хавьера зависит от оболочки и не будет работать во всех оболочках.

Ответы sed, на которые ссылаются MrTelly и epochwolf, являются неполными и должны выглядеть примерно так:

MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`

Причина, по которой это работает без необходимости использовать $ для обозначения конца, состоит в том, что первый символ '. *' Является жадным и будет пытаться собрать как можно больше, в то время как остальная часть регулярного выражения будет истинной. 1006 *

Эта команда sed должна нормально работать в любом используемом контексте оболочки.

0 голосов
/ 07 февраля 2009

Я бы посмотрел справочные страницы для awk или sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...