AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 677784
Accepted
Gagan
Gagan
Asked: 2021-11-17 05:14:59 +0800 CST2021-11-17 05:14:59 +0800 CST 2021-11-17 05:14:59 +0800 CST

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

  • 772

/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-linux或os替换,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

sed
  • 1 1 个回答
  • 98 Views

1 个回答

  • Voted
  1. Best Answer
    terdon
    2021-11-17T05:55:03+08:002021-11-17T05:55:03+08:00

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

    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 脚本中使用 CAPITAL 变量名。不过,这会起作用:

    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
    
    • 3

相关问题

  • Linux grep文件1中的内容在文件2中[重复]

  • 如何在第三个逗号后用条件grep行

  • 根据第一个逗号之前的匹配删除重复行数

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve