如何用sed在GRUB_CMDLINE_LINUX行引号前添加指定参数且避免重复
解决GRUB_CMDLINE_LINUX参数添加位置错误及重复添加问题
问题说明
需求:在以GRUB_CMDLINE_LINUX开头的行中,将scsi_mod.scan=sync添加到双引号内部的末尾;若该参数已存在,则不重复添加。
之前执行的错误命令:
sed -i '/GRUB_CMDLINE_LINUX/s/$/ scsi_mod.scan=sync/' /etc/default/grub
错误结果:参数被添加到双引号外部
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=VG/LV_root rd.lvm.lv=VG/lv_swap ipv6.disable=1 rhgb quiet scsi_mod.scan=sync" scsi_mod.scan=sync GRUB_DISABLE_RECOVERY="true"
预期结果:参数位于双引号内部末尾
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=VG/LV_root rd.lvm.lv=VG/lv_swap ipv6.disable=1 rhgb quiet scsi_mod.scan=sync" GRUB_DISABLE_RECOVERY="true"
正确命令
使用以下sed命令可同时解决位置错误和重复添加问题:
sed -i '/GRUB_CMDLINE_LINUX/ { /scsi_mod.scan=sync/! s/"$/ scsi_mod.scan=sync"/ }' /etc/default/grub
命令解析
/GRUB_CMDLINE_LINUX/:仅匹配以GRUB_CMDLINE_LINUX开头的行/scsi_mod.scan=sync/!:对不包含scsi_mod.scan=sync的行执行后续替换s/"$/ scsi_mod.scan=sync"/:将行尾的双引号"替换为scsi_mod.scan=sync",把参数添加到引号内部末尾
验证效果
执行正确命令后,/etc/default/grub中GRUB_CMDLINE_LINUX行的参数会被正确放置在引号内,且不会重复添加已存在的参数。
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

