bash - 替换 yaml 文件中的行

标签 bash awk sed yaml netplan

我正在尝试创建一个脚本来替换 01-network-manager-all.yaml 文件中给定网络接口(interface)的参数。

文件看起来像这样:

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
      addresses: [195.10.10.10/24]
      gateway4: 195.10.10.10
      nameservers:
        addresses: [1.1.1.1]
    enp0s8:
      dhcp4: no
      dhcp6: no
      addresses: [196.10.10.10/24]
      gateway4: 196.10.10.10
      nameservers:
        addresses: [1.1.1.1]
    enp0s9:
      dhcp4: no
      dhcp6: no
      addresses: [197.10.10.10/24]
      gateway4: 197.10.10.10
      nameservers:
        addresses: [1.1.1.1]

假设我想替换有关 enp0s8 的行,其余的保持原样。

输出看起来像这样:

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
      addresses: [195.10.10.10/24]
      gateway4: 195.10.10.10
      nameservers:
        addresses: [1.1.1.1]
    enp0s8:
      dhcp4: no
      dhcp6: no
      addresses: [196.250.250.125/24]
      gateway4: 196.250.250.125
      nameservers:
        addresses: [8.8.8.8]
    enp0s9:
      dhcp4: no
      dhcp6: no
      addresses: [197.10.10.10/24]
      gateway4: 197.10.10.10
      nameservers:
        addresses: [1.1.1.1]

在这种情况下,我正在寻找一个 sed - 或任何其他命令 - 将替换 enp0s8enp0s9 之间的所有内容.

我不是一个非常有经验的 Bash 用户,任何提示将不胜感激。

我这样做的失败尝试

sed -e '/^ *enp0s8:/,/^ *^enp0s9:/s/$CONFIG_TO_ADD/' "/etc/netplan/01-network-manager-all.yaml"

最佳答案

我会使用理解 YAML 的工具而不是纯文本操作。比如 ruby :

$ ruby -e '
    require "yaml"
    data = YAML.safe_load_file(ARGV[0])
    net = data["network"]["ethernets"]["enp0s8"]
    net["addresses"] = ["196.250.250.125/24"]
    net["gateway4"] = "196.250.250.125"
    net["nameservers"]["addresses"] = ["8.8.8.8"]
    puts data.to_yaml
' file.yml
---
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
      addresses:
      - 195.10.10.10/24
      gateway4: 195.10.10.10
      nameservers:
        addresses:
        - 1.1.1.1
    enp0s8:
      dhcp4: false
      dhcp6: false
      addresses:
      - 196.250.250.125/24
      gateway4: 196.250.250.125
      nameservers:
        addresses:
        - 8.8.8.8
    enp0s9:
      dhcp4: false
      dhcp6: false
      addresses:
      - 197.10.10.10/24
      gateway4: 197.10.10.10
      nameservers:
        addresses:
        - 1.1.1.1

关于bash - 替换 yaml 文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68256981/

相关文章:

awk - 按列名打印列内容

awk - 是否有可以处理 s 表达式流的类似 Awk 或 Lisp 的编程语言?

ios - 如何在 Xcode 中导入 Firebase

database - 使用 bash 脚本从在线数据库下载文件

windows - 从 Cygwin 批量获取命令结果

c - 如何将 C 代码转换为汇编的十六进制表示形式?

bash - awk 或 sed 帮助修改 CSV 或 TSV 文件的第一行

awk - awk 中的两个文件处理

regex - 删除 sed 中的重复字符和控制字符

linux - 使用 sed 和变量剪切日志文件