【发布时间】:2019-04-18 08:09:02
【问题描述】:
我使用 jq 从 json 文件中读取数据。我想将结果附加到一个 yaml 文件中,但我没有让它工作。我对 shell 编程很陌生。我的目标是将“用户”附加到 yaml 文件中现有的“用户”数组中。
这是我的 json 文件:
#$DEFAULTS_FILE
{"users":
[
{"name":"pi",
"gecos": "Hypriot Pirate",
"sudo":"ALL=(ALL) NOPASSWD:ALL",
"shell": "/bin/bash",
"groups":"users,docker,video",
"plain_text_passwd":"pi",
"lock_passwd":"false",
"ssh_pwauth":"true",
"chpasswd": {"expire": false}
},
{"name":"admin",
"gecos": "Hypriot Pirate",
"sudo":"ALL=(ALL) NOPASSWD:ALL",
"shell": "/bin/bash",
"primary-group": "users",
"groups":"users,docker,adm,dialout,audio,plugdev,netdev,video",
"ssh-import-id":"None",
"plain_text_passwd":"pi",
"lock_passwd":"true",
"ssh_pwauth":"true",
"chpasswd": "{expire: false}",
"ssh-authorized-keys": ["ssh-rsa abcdefg1234567890 YOUR_KEY@YOURHOST.local"]
}
]
}
我用那个过滤它:
cat $DEFAULTS_FILE | jq .users
我不知道如何将该 json 转换为 yaml。
我的预期结果应该是:
users:
- name: pi
gecos: "Hypriot Pirate"
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
groups: users,docker,video
plain_text_passwd: pi
lock_passwd: false
ssh_pwauth: true
chpasswd: { expire: false }
- name: admin
primary-group: users
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users,docker,adm,dialout,audio,plugdev,netdev,video
ssh-import-id: None
我尝试使用名为yq 的第二个工具,它类似于jq,可以编写yaml 文件。但我没有积极的进展。
编辑
我知道我可以将内容添加到 yaml 中:
yq w -i "my.yml" "users[+]" "some content"
但我不知道如何将我的 json 合并到其中。
任何帮助或提示都会很好,在此先感谢您...
【问题讨论】:
-
你可以使用
python/perl内置YAML和JSON模块 - commandlinefu.com/commands/view/12218/convert-yaml-to-json -
正好相反
-
Bash 本身并不是一个很好的平台。找到一个现有的工具,或者写一个,例如Python。根据您的首选语言,在 Stack Overflow 上找到现有问题并提供建议应该不难; here's a search for Python
-
请遵循minimal reproducible example 准则。特别是,一个示例 my.yml(即输入)会很有帮助。
-
yq r input.json应该可以完成这项工作。