我用 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.用户
我不知道如何将该 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[+]""一些内容"
但我不知道如何将我的 json 合并到其中。
任何帮助或提示都很好,在此先感谢您......
最佳答案
yq
jq
用yq 4.18.1+
cat "$DEFAULTS_FILE" | yq -P # or yq --prettyPrint
参见:https://mikefarah.gitbook.io/yq/#notice-for-v4.x-versions-prior-to-4.18.1
使用 yq 4.8.0 版本:
cat $DEFAULTS_FILE | yq e -P -
e
或eval
分别处理文件。ea
或eval-all
将首先合并文件。-P
或--prettyPrint
YAML 输出-
来自 STDIN
注意:您也可以采用其他方式(yaml 到 json)yq e -j file.yaml
使用 yq 版本 3.3.2:
cat $DEFAULTS_FILE | yq r -P -
r
阅读-P
--prettyPrint-
来自 STDIN
关于json - 如何在 bash 中将 json 响应转换为 yaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53315791/