У мене є файл з іменем .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прикладом, буде більш самодокументування.