Файл содержит следующее в строке 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