Як замінити цілу лінію на sed?


132

Припустимо, у мене є файл з рядками

aaa = bbb

Тепер я хотів би замінити їх на:

ааа = ххх

Я можу це зробити так:

sed "s / aaa = bbb / aaa = xxx / g"

Тепер у мене є файл з кількома рядками:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [щось інше]

Як я можу замінити всі ці рядки aaa=[something]за aaa=xxxдопомогою sed ?


2
Це [something else]буквальний текст, чи це просто заповнення? Який можливий формат речі після знака рівності?
ean5533

це скоріше питання регексу, а не питання.
saferJo

Відповіді:


217

Спробуйте це:

sed "s/aaa=.*/aaa=xxx/g"

4
Сила звички, її можна ігнорувати в цьому випадку - вона використовується як глобальна заміна лінії для заміни кожного матчу, а не лише першого. У цьому випадку, хоча тільки перший буде збігатися через .*.
Джон Дойль

1
Майкл Дж. Барбер, gзамініть всі екземпляри повторного витіснення заміною
A-IV

116

Ви також можете використовувати лінію зміни sed для цього:

sed -i "/aaa=/c\aaa=xxx" your_file_here

Це пройде і знайде будь-які рядки, які проходять aaa=тест, а це означає, що рядок містить літери aaa=. Потім він замінює весь рядок на aaa = xxx. Ви можете додати ^тест на початку тесту, щоб переконатися, що ви отримаєте лише ті рядки, які починаються, aaa=але це залежить від вас.


12
OS ікси sedвимагає , cщоб слідувати зворотний слеш і символ нового рядка, і він не додає новий рядок вставленого тексту, але ви можете використовувати, наприклад $'/aaa=/c\\\naaa=xxx\n'.
Лрі

Ось і приклад у документації sed про функцію зміни / заміни @Mr. Т говориться про.
gene_wood

Це найближче до того, щоб насправді робити те, що просили ... (Але для переносимості потрібна версія Лрі)
Герт ван ден Берг

42

Подобається це:

sed 's/aaa=.*/aaa=xxx/'

Якщо ви хочете гарантувати, що aaa=на початку рядка, зробіть це:

sed 's/^aaa=.*/aaa=xxx/'

1
Що робити, якщо я хочу замінити на aaa = 'xxxx'. Я намагався втекти, як, sed 's/aaa=.*/aaa=\'xxx\'/'але це відкриває >підказку в новому рядку ...
Nagev



0

Це може допомогти вам:

cat <<! | sed '/aaa=\(bbb\|ccc\|ddd\)/!s/\(aaa=\).*/\1xxx/'
> aaa=bbb
> aaa=ccc
> aaa=ddd
> aaa=[something else]
!
aaa=bbb
aaa=ccc
aaa=ddd
aaa=xxx

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