У мене є файл з іменем .ignore
. Потрібно замінити projdir
. Наприклад:
ignore \..*
ignore README
projdir Snake
Мені потрібно замінити Змія на, наприклад, "PacMan". Я читаю сторінку man, але поняття не маю, що робити.
У мене є файл з іменем .ignore
. Потрібно замінити projdir
. Наприклад:
ignore \..*
ignore README
projdir Snake
Мені потрібно замінити Змія на, наприклад, "PacMan". Я читаю сторінку man, але поняття не маю, що робити.
Відповіді:
Знайдіть рядок, що починається з projdir
, і замініть весь рядок на новий:
sed -i 's/^projdir .*$/projdir PacMan/' .ignore
^
і $
є маркерами початку / кінця рядка, тому шаблон буде відповідати всій лінії; .*
відповідає що завгодно. -i
Каже , sed
щоб записати зміни безпосередньо .ignore
, замість того , щоб просто виводити їх
Один із підходів - переписати весь рядок, використовуючи зворотні параметри для частин, які ви хочете зберегти:
sed -e 's/^\( *projdir *\)[^ ]*\(.*\)*$/\1PacMan\2/'
Інший підхід полягає в тому, щоб переписати цю частину рядка, але тільки якщо якась інша частина відповідає:
sed -e '/^ *projdir / s/ [^# ]/ PacMan/'
Обидва приклади переписують друге слово, розмічене пробілом, на рядках, де є перше слово projdir
.
Хоча це старий пост і, здається, вирішено для вас прийнятою відповіддю, на власне питання не було відповіді. Тож для повноти та допомоги іншим:
Ось відповідь, що насправді відповідає "Змії", а не для рядків, що починаються з "продір" ...
sed -r 's/(^.*)Snake/\1PacMan' .ignore
Це замінює все, починаючи з початку рядка, включаючи "Snake", і все до "Snake" + "PacMan". \ 1 означає те, що збігається всередині (). Все після "Змії" залишається недоторканим.
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore
^ projdir - це знайти рядок, який починається з рядка projdir. . * $ Є рядком після projdir у рядку того самого рядка. Рядок projdir PacMan - це рядок, який ми заміняємо. g призначений для глобального - замінити всі такі рядки, починаючи з projdir. .ignore - це ім'я файлу
-i
, який є--in-place
прикладом, буде більш самодокументування.