Як можна замінити текст після конкретного слова за допомогою sed?


12

У мене є файл з іменем .ignore. Потрібно замінити projdir. Наприклад:

ignore \..*
ignore README
projdir Snake

Мені потрібно замінити Змія на, наприклад, "PacMan". Я читаю сторінку man, але поняття не маю, що робити.

Відповіді:


18

Знайдіть рядок, що починається з projdir, і замініть весь рядок на новий:

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

^і $є маркерами початку / кінця рядка, тому шаблон буде відповідати всій лінії; .*відповідає що завгодно. -iКаже , sedщоб записати зміни безпосередньо .ignore, замість того , щоб просто виводити їх


Якщо ви використовуєте довгий варіант для -i, який є --in-placeприкладом, буде більш самодокументування.
Ілля Лінн

5

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

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

Інший підхід полягає в тому, щоб переписати цю частину рядка, але тільки якщо якась інша частина відповідає:

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

Обидва приклади переписують друге слово, розмічене пробілом, на рядках, де є перше слово projdir.


3

Хоча це старий пост і, здається, вирішено для вас прийнятою відповіддю, на власне питання не було відповіді. Тож для повноти та допомоги іншим:

Ось відповідь, що насправді відповідає "Змії", а не для рядків, що починаються з "продір" ...

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

Це замінює все, починаючи з початку рядка, включаючи "Snake", і все до "Snake" + "PacMan". \ 1 означає те, що збігається всередині (). Все після "Змії" залишається недоторканим.


1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir - це знайти рядок, який починається з рядка projdir. . * $ Є рядком після projdir у рядку того самого рядка. Рядок projdir PacMan - це рядок, який ми заміняємо. g призначений для глобального - замінити всі такі рядки, починаючи з projdir. .ignore - це ім'я файлу


1
Чи можете ви, будь ласка, розширити свою відповідь та уточнити, що таке?
Ромео Нінов

Відповіді набагато корисніші, якщо вони містять пояснення того, як і чому працює команда чи фрагмент коду.
Ентоні Геоґеган

Сподіваюся, це стане кориснішим після редагування
Tinu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.