Как использовать sed для замены целой строки на другую с символами в ней

642
Helme

Файл содержит следующую строку 19

send -- "old@example.com\r"

Я хочу изменить адрес электронной почты, поэтому я подумал и придумал это

sed -i.bak '19s/.*/send -- "new@example.com\r"/' ./a 

это меняет строку 19, но то, что я получаю,

"end -- "new@example.com 

Что происходит не так и как это исправить?

0

3 ответа на вопрос

0
l0b0

Backslash является маскирующим в sedузорах, поэтому буквальный возврат каретки вставляется. То, что вы хотите \\r- это экранированный обратный слеш, за которым следует литерал r.

Я думаю, мне нужно немного поспать, ха-ха! Спасибо за вашу помощь! Helme 6 лет назад 0
0
fpmurphy1

Вместо того, чтобы выполнять поиск и замену, вы можете просто изменить 19-ю строку:

sed '19c\send -- "new@example.com\\r"' 
0
cas

Вы делаете это сложнее, чем нужно - просто измените адрес электронной почты, а не всю строку. Показывать:

$ echo 'send -- "old@example.com\r"' | sed 's/old@example\.com/new@example.com/' send -- "new@example.com\r" 

Кстати, вы можете дополнительно использовать g(глобальный) модификатор в конце командыs/// команды, если шаблон поиска может встречаться более одного раза в строке, и / или iмодификатор (игнорировать регистр), если вы хотите поиск без учета регистра - например, для использовать как: s/old@example\.com/new@example.com/ig.

В любом случае, ваша команда будет выглядеть так:

sed -i.bak '19s/old@example\.com/new@example.com/' ./a 

Если вам неизвестно, какой именно номер строки нужно изменить, укажите в качестве адреса строки регулярное выражение, а не номер строки:

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/new@example.com/' ./a 

Еще проще изменить ВСЕ вхождения old@example.com в файле, просто не надо указывать адрес, и замена будет происходить в каждой строке файла.

sed -i.bak 's/old@example\.com/new@example.com/' ./a 
Дело в том, что sed может очень легко стать загадочным и с ним трудно разобраться, я занимался чем-то другим, и это было просто препятствием, которое я хотел преодолеть в любом случае, но огромное спасибо за вашу помощь! Helme 6 лет назад 0

Похожие вопросы