Как я могу заменить текст после определенного слова, используя sed?

12

У меня есть файл с именем .ignore. При необходимости заменить projdir. Например:

ignore \..*
ignore README
projdir Snake

Мне нужно заменить Snake, например, на «PacMan». Я прочитал справочную страницу, но понятия не имею, что делать.

Якуб Баски Габчо
источник

Ответы:

18

Найдите строку, которая начинается с projdir, и замените всю строку новой:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^и $являются маркерами начала / конца строки, поэтому шаблон будет соответствовать всей строке; .*соответствует чему угодно. -iГоворит , sedчтобы записать изменения непосредственно .ignore, вместо того , чтобы просто выводить их

Михаил Мрозек
источник
5

Один из подходов - переписать всю строку, используя обратные ссылки для частей, которые вы хотите сохранить:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Другой подход состоит в том, чтобы переписать эту часть строки, но только если совпадает какая-то другая часть:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

Оба примера переписывают второе слово, разделенное пробелом, в строках, где находится первое слово projdir.

Жиль "ТАК - перестань быть злым"
источник
3

Несмотря на то, что это старый пост, и кажется, что он решен для вас принятым ответом, на настоящий вопрос ответ не получен. Итак, для полноты и помощи другим:

Здесь ответ, который на самом деле соответствует «Змея», а не для строк, начинающихся с «projdir» ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Это заменяет все с начала строки, включая «Змею», на все, что до «Змеи» + «PacMan». \ 1 обозначает то, что сопоставляется внутри (). Все после «Змеи» остается нетронутым.

Moritz
источник
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir - найти строку, начинающуюся со строки projdir. . * $ Там обозначает строку после projdir в строке той же строки. Строка projdir PacMan - это строка, которую мы заменяем. g для global - заменить все такие строки, начиная с projdir. .ignore это имя файла

Tinu
источник
1
Можете ли вы расширить свой ответ и уточнить, что к чему?
Ромео Нинов
Ответы гораздо полезнее, если они содержат объяснения того, как и почему работает команда или фрагмент кода.
Энтони
Я надеюсь , что это более полезно после редактирования
Tinu