Назад | Перейти на главную страницу

sed вставить строку в совпадающую строку внутри кавычек

Я пишу сценарий оболочки, который изменяет параметры GRUB:

sed "/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/$/ mem_sleep_default=deep /" /etc/default/grub

Эта команда sed соответствует строке GRUB_CMDLINE_LINUX_DEFAULT="quietipv6.disable=1" но добавляет mem_sleep_default после таких цитат:

GRUB_CMDLINE_LINUX_DEFAULT="quietipv6.disable=1" mem_sleep_default=deep

Как я могу изменить этот sed, чтобы вставить `mem_sleep_default в кавычки?

пытаться

sed "/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/\(\"[^\"]*\)$/ mem_sleep_default=deep &/"

где

  • \(\"[^\"]*\)$/ скажи sed запомнить \( ... \) цитируемая цитата \ ", за которой следует любой другой символ [^\"]* за которым следует конец строки $
  • & вставит запомненный образец

Вы в настоящее время соответствуете в конце строки шаблону поиска s/$/.

Вместо этого вы можете захотеть сопоставить завершающую двойную кавычку, за которой следует EOL с s/\"$/ (Обратите внимание, что вам нужно экранировать двойную кавычку обратной косой чертой \")

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

sed "/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/\"$/ mem_sleep_default=deep\"/" /etc/default/grub