简体   繁体   English

如何用 sed 用变量替换字符串

[英]How to replace string with variable with sed

I'm trying to insert a string stored in a variable with sed as follows:我正在尝试使用 sed 插入存储在变量中的字符串,如下所示:

sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT.*/$kernel_options/g" /etc/default/grub

Line that I am trying to replace is: GRUB_CMDLINE_LINUX_DEFAULT=""我要替换的行是: GRUB_CMDLINE_LINUX_DEFAULT=""

Variable is:变量是:

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} and ${disk_append} are determined earlier with: ${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

I can't seem to get the sed part working, any suggestions how to improve this are appreciated.我似乎无法让 sed 部件工作,任何如何改进它的建议都值得赞赏。

Thank you in advance.先感谢您。

Thank you very much, Gordon Davisson.非常感谢你,戈登戴维森。

It works if I create a second variable like so:如果我像这样创建第二个变量,它会起作用:

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

How about using a and d instead of s ?使用ad代替s怎么样?

sed -i "/^GRUB_CMDLINE_LINUX_DEFAULT/{
a $kernel_options
d}" /etc/default/grub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM