sed + 在特定行末尾但特定字符之前附加文本

问题描述 投票:0回答:2

我想在以

scsi_mod.scan=sync
开头的行的末尾添加文本
GRUB_CMDLINE_LINUX
,并将文本附加到行尾但在字符
"
之前。

如果

scsi_mod.scan=sync
已存在,则
sed
不应附加额外的
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"
linux bash sed rhel
2个回答
2
投票

使用 GNU

sed
,你可以尝试:

sed -i '/GRUB_CMDLINE_LINUX/{/scsi_mod.scan=sync"$/!s/"$/ scsi_mod.scan=sync"/}' /etc/default/grub

如果您想跳过添加,即使现有的

scsi_mod.scan=sync
位于行中的任何位置,而不仅仅是在末尾:

sed -i '/GRUB_CMDLINE_LINUX/{/\<scsi_mod.scan=sync\>/!s/"$/ scsi_mod.scan=sync"/}' /etc/default/grub

0
投票

使用 $ 替换结尾双引号“$ with scsi_mod.scan=sync”。还确保在右双引号之前添加 scsi_mod.scan=sync。

您的命令应该是:

sed -i '/GRUB_CMDLINE_LINUX/s/"$/ scsi_mod.scan=sync"/' demofile

这将起到 Charm 的作用,请确保根据您的情况更改文件名。

© www.soinside.com 2019 - 2024. All rights reserved.