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

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

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

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

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

"end -- "new@example.com

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

3 ответа3

0

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

0

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

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

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

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

Кстати, вы можете дополнительно использовать модификатор g (global) в конце команды 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .