【问题标题】:How to replace string with variable with sed如何用sed用变量替换字符串
【发布时间】:2021-07-04 19:03:54
【问题描述】:

我正在尝试使用 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 部分正常工作,感谢任何关于如何改进它的建议。

提前谢谢你。

【问题讨论】:

  • sed 部分在我看来不错....echo $kernel_options 的输出是什么,您如何设置 kernel_options?你要出口吗?
  • 由于替换字符串包含 sed 元字符,因此需要对其进行转义。 thisthis 解决问题了吗?

标签: linux bash awk sed


【解决方案1】:

非常感谢您,戈登·戴维森。

如果我像这样创建第二个变量,它会起作用:

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

【讨论】:

    【解决方案2】:

    ad 代替s 怎么样?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2023-03-27
      • 1970-01-01
      • 2021-10-04
      相关资源
      最近更新 更多