У меня есть файл с именем .ignore
. При необходимости заменить projdir
. Например:
ignore \..*
ignore README
projdir Snake
Мне нужно заменить Snake, например, на «PacMan». Я прочитал справочную страницу, но понятия не имею, что делать.
У меня есть файл с именем .ignore
. При необходимости заменить projdir
. Например:
ignore \..*
ignore README
projdir Snake
Мне нужно заменить Snake, например, на «PacMan». Я прочитал справочную страницу, но понятия не имею, что делать.
Ответы:
Найдите строку, которая начинается с projdir
, и замените всю строку новой:
sed -i 's/^projdir .*$/projdir PacMan/' .ignore
^
и $
являются маркерами начала / конца строки, поэтому шаблон будет соответствовать всей строке; .*
соответствует чему угодно. -i
Говорит , sed
чтобы записать изменения непосредственно .ignore
, вместо того , чтобы просто выводить их
Один из подходов - переписать всю строку, используя обратные ссылки для частей, которые вы хотите сохранить:
sed -e 's/^\( *projdir *\)[^ ]*\(.*\)*$/\1PacMan\2/'
Другой подход состоит в том, чтобы переписать эту часть строки, но только если совпадает какая-то другая часть:
sed -e '/^ *projdir / s/ [^# ]/ PacMan/'
Оба примера переписывают второе слово, разделенное пробелом, в строках, где находится первое слово projdir
.
Несмотря на то, что это старый пост, и кажется, что он решен для вас принятым ответом, на настоящий вопрос ответ не получен. Итак, для полноты и помощи другим:
Здесь ответ, который на самом деле соответствует «Змея», а не для строк, начинающихся с «projdir» ...
sed -r 's/(^.*)Snake/\1PacMan' .ignore
Это заменяет все с начала строки, включая «Змею», на все, что до «Змеи» + «PacMan». \ 1 обозначает то, что сопоставляется внутри (). Все после «Змеи» остается нетронутым.
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore
^ projdir - найти строку, начинающуюся со строки projdir. . * $ Там обозначает строку после projdir в строке той же строки. Строка projdir PacMan - это строка, которую мы заменяем. g для global - заменить все такие строки, начиная с projdir. .ignore это имя файла