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

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

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

send -- "[email protected]\r"

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

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

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

"end -- "[email protected]

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

решение1

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

решение2

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

sed '19c\send -- "[email protected]\\r"'

решение3

Вы усложняете задачу больше, чем нужно — просто измените адрес электронной почты, а не всю строку. Для демонстрации:

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

Кстати, вы можете по желанию использовать gмодификатор (global) в конце команды command, s///если шаблон поиска может встречаться в строке более одного раза, и/или iмодификатор (ignore register), если вы хотите выполнить поиск без учета регистра — например, использовать оба: .s/old@example\.com/[email protected]/ig

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

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

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

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

Еще проще изменить ВСЕ вхождения[email protected]в файле просто не беспокойтесь об указании адреса, и замена произойдет в каждой строке файла.

sed -i.bak 's/old@example\.com/[email protected]/' ./a

Связанный контент