sed 更新 GRUB 文件的用法

Bre*_*222 4 grub2 scripts sed text-processing 16.04

我刚开始使用 sed,但很快就爱上了它,因为它在自动化方面具有普遍的灵活性。我希望每次部署新系统时都运行具有各种安全控制的脚本,其中一部分需要我锁定 GRUB。我希望从 GRUB 菜单中解锁一般的 Ubuntu 选项,这样任何人都可以在没有密码的情况下使用它,同时保护其他所有内容的密码。

话虽如此,我希望在 /boot/grub/grub.cfg 文件中搜索特定行并将 --unrestricted 添加到该选项。(我们只使用 16.04.03 所以理论上所有系统在安装时都会有相同的文件)

文件中的行是:

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2aa7ed2c-67a7-42d5-84fb-0ddab74c5dd0' {
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像:

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-simple-2aa7ed2c-67a7-42d5-84fb-0ddab74c5dd0' {
Run Code Online (Sandbox Code Playgroud)

我知道 sed -i 用于就地编辑, s/ 应该搜索。但除此之外,我对这里的语法迷失了,让它真正做我们需要的。据我所知,需要 --unrestricted 的定位,因为我相信如果我们不必进行如此长时间的搜索会更容易,但我再次对 sed 感到陌生并且不确定。有人可以帮我插入这个 sed 吗?最好也向我解释为什么不同的语法会出现在它的位置,所以我知道未来。

Cha*_*een 5

我的回答类似于 RaidPinata 的:

sudo sed -i s'/--class os \$menu/--class os --unrestricted \$menu/' /etc/default/grub
Run Code Online (Sandbox Code Playgroud)

"\$" 转义了 "$" 符号,这样它就不会被误解,我指定了一个更长的字符串,这样如果命令执行两次,你就不会得到两次插入。

  • @Brendan77222 `sed` 允许您动态定义开始和结束 's' 命令的分隔符 - RaidPinata 使用了 "/ 而我使用了 '/ ... 使用 " 而不是 ' 的行为存在一些差异。恐怕我还在边学边学,所以我不会有太大帮助! (2认同)
  • @Brendan77222 这是一个关于引用和元字符的不错教程 [https://www.grymoire.com/Unix/Quote.html](https://www.grymoire.com/Unix/Quote.html) (2认同)