Я пытаюсь вставить строку, хранящуюся в переменной с помощью sed, следующим образом:
sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT.*/$kernel_options/g" /etc/default/grub
Строка, которую я пытаюсь заменить:
GRUB_CMDLINE_LINUX_DEFAULT = ""
Переменная:
kernel_options = "GRUB_CMDLINE_LINUX_DEFAULT=\"cryptdevice=${target_disk}${disk_append}2:luks:allow-discards resume=/dev/lvm/swap mem_sleep_default=deep i915.enable_psr=0 i915.enable_fbc=1 i915.enable_guc=2\""
${target_disk} и ${disk_append} определяются ранее с помощью:
target_disk=$(dialog --clear --title "Harddisk" --radiolist "Please select the target device" 0 0 0 \
$(ls /dev/sd? /dev/vd? /dev/mmcblk? /dev/nvme?n? -1 2> /dev/null | while read line; do
echo "$line" "$line" on; done) 3>&1 1>&2 2>&3)
if test $? -eq 1; then exit 1; fi
if grep -q "mmcblk" <<< $target_disk || grep -q "nvme" <<< $target_disk; then
disk_append=p
fi
Кажется, я не могу заставить часть sed работать, любые предложения по улучшению этого приветствуются.
Заранее спасибо.





Большое спасибо, Гордон Дэвиссон.
Это сработает, если я создам вторую переменную вот так:
kernel_options = "GRUB_CMDLINE_LINUX_DEFAULT=\"cryptdevice=${target_disk}${disk_append}2:luks:allow-discards resume=/dev/lvm/swap mem_sleep_default=deep i915.enable_psr=0 i915.enable_fbc=1 i915.enable_guc=2\""
escaped_kernel_options=$(printf '%s\n' "$kernel_options" | sed -e 's/[]/$*.^[]/\\&/g');
sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT.*/$escaped_kernel_options/g" /etc/default/grub
Как насчет использования a и d вместо s?
sed -i "/^GRUB_CMDLINE_LINUX_DEFAULT/{
a $kernel_options
d}" /etc/default/grub
Часть sed мне нравится .... каков результат echo $ kernel_options и как вы устанавливаете kernel_options? вы это экспортируете?