Используйте это:
sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
-e '/^# DBName=.*/{a \DBName=localhost
:a;n;ba;q}' -e '$a \DBName=localhost' file
Где:
-e
ищет ^ DBName знак равно*
( ^
означает от начала строки), и если он найден, выполняется часть в скобках {}
: это будет искать и заменять строки и по завершении : a
устанавливает метку с именем a
, n
считывает следующую строку в пространстве шаблонов и печатает ее. ba
возвращается к метке a
. Все это заставляет sed
печатать все оставшиеся строки нетронутыми. Теперь sed
завершается с помощью команды q
на этом этапе, и другие выражения не будут обрабатываться. Так что замена производится только один раз. # DBName =. *
, и если найдено ,
добавляет DBName = localhost
к следующая строка. Обратите внимание, что новая строка здесь в команде необходима, потому что после команды a
в строке не должно быть ничего. Когда это сложение выполнено, : a; n; ba; q
делает то же самое, что и в первом выражении. Если нет ... $
) с помощью команды a
строку DBName = localhost
. Обратите внимание, что вы указали errors=remount-ro
в качестве опции. Таким образом, если произойдет ошибка, вы обнаружите, что ваш носитель стал -только для чтения.
Вы можете заменить это на errors=continue
, чтобы игнорировать такие ошибки. Вы, наверное, не хотите.
Если вы заметили это достаточно скоро, вы можете проверить dmesg
или другие источники регистрации(journalctl
? )на «плохой» системе, чтобы увидеть, не возникали ли такие ошибки.