Sed 替换包含空格和双引号的字符串

Sed 替换包含空格和双引号的字符串

/boot/grub/grub.cfg我试图在每次 grub 更新时在脚本中使用 sed 来修改 grub 配置文件 ( ) 中的一行。我希望替换以下行:

menuentry "Kali GNU/Linux"

有了这个:

'menuentry "Kali GNU/Linux" --class kali'

/boot/grub/grub.cfg 中的行如下:

menuentry "Kali GNU/Linux" --class gnu-linux --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-5.14.0-kali2-amd64--7afb9c25-9d47-4ce4-a3dd-635aa0b04d7a'

基本上,我想做的是添加行--class kali.我无法替换gnu-linuxor oswith,kali因为这些词多次出现。

我使用的脚本如下:

TARGET_STRING='menuentry "Kali GNU/Linux"'
NEW_STRING='menuentry "Kali GNU/Linux" --class kali'
sudo sed -i "s/$TARGET_STRING/$NEW_STRING/g" /boot/grub/grub.cfg

这无法工作,并给出以下错误:

sed: -e expression #1, char 32: unknown option to `s'

我在网上找到了替换包含空格的字符串的解决方案这里并替换包含双引号的字符串这里,但当字符串同时包含两者时则不然。

有人可以帮我吗?

注意:我正在使用GNU sed 4.7

答案1

不需要变量。直接使用字符串即可:

sudo sed -i 's|menuentry "Kali GNU/Linux"|menuentry "Kali GNU/Linux" --class kali|' /boot/grub/grub.cfg

您收到错误是因为您的字符串包含/和 您在运算符中用作/分隔符s///。不过,您可以使用任何字符,这就是我在s|||上面使用的原因。一般来说,您需要确保选择的字符不存在于 或$target_string$new_string。在本示例中如此|,但您可能需要为其他情况选择另一个。

如果你真的非常想使用变量,它们只是没有帮助。另外,作为一般规则,最好避免在 shell 脚本中使用大写变量名称。但这会起作用:

target_string='menuentry "Kali GNU/Linux"'
new_string='menuentry "Kali GNU/Linux" --class kali'
sudo sed -i "s|$target_string|$new_string|" /boot/grub/grub.cfg

相关内容