sed поменял адрес в выводе дважды, а файл остался прежним. Здесь — почему так и как ограничить замену нужной строкой.
sed — потоковый редактор. Он читает файл или стандартный ввод по строке, выполняет над каждой строкой свою команду и печатает результат. Сам файл sed не трогает, поэтому cat показал прежний адрес.
Команда s/старое/новое/ заменяет в строке первое совпадение с шаблоном. Шаблон — регулярное выражение, как в grep, и ищется в любом месте строки: адрес нашёлся и в backend=, и в комментарии. Буква g в конце, s/старое/новое/g, заменяет все совпадения в строке.
Перед командой можно поставить адрес — шаблон в косых чертах. Тогда команда работает в строках, где шаблон совпал, а остальные строки sed печатает как есть:
Таймаут сменился, а строки с адресом остались прежними: ни одна из них не начинается с timeout=.
В одном конфиге бэкенд другой — backend=10.0.0.50:8080. Что станет с этой строкой после sed '/^backend=/s/10\.0\.0\.5/10.0.0.9/'?
-
sed заменил совпавшие знаки, 10.0.0.5, а 0 после них остался на месте: вышло 10.0.0.90.
-
Шаблон ищется в любом месте строки:
10.0.0.5— начало10.0.0.50, и sed его заменил. Проверь:echo 'backend=10.0.0.50:8080' | sed 's/10\.0\.0\.5/10.0.0.9/'. -
Ошибки нет: шаблон совпал с частью строки, и sed заменил эту часть.
Шаблон замены, как в grep, ищется в любом месте строки, и 10.0.0.5 совпал с началом 10.0.0.50. sed заменил совпавшие знаки и получил чужой адрес 10.0.0.90. Границу задаёт следующий знак в шаблоне: s/10\.0\.0\.5:/10.0.0.9:/ строку с 10.0.0.50 не тронет.
Главное в шаге
- sed печатает изменённый поток, а файл оставляет как был.
-
s/старое/новое/меняет первое совпадение в строке, сg— все. -
Адрес
/шаблон/перед командой ограничивает её строками, где шаблон совпал.