我正在尝试创建一个脚本来替换 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
- 或任何其他命令 - 将替换 enp0s8
和 enp0s9
之间的所有内容.
我不是一个非常有经验的 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/