【发布时间】:2019-03-08 18:34:50
【问题描述】:
我在 YAML 子集中有一个文件,其中包含如下数据:
# This is a comment
# This is another comment
spark:spark.ui.enabled: 'false'
spark:spark.sql.adaptive.enabled: 'true'
yarn:yarn.nodemanager.log.retain-seconds: '259200'
我需要将其转换成如下所示的 JSON 文档(请注意,包含布尔值和整数的字符串仍然是字符串):
{
"spark:spark.ui.enabled": "false",
"spark:spark.sql.adaptive.enabled": "true",
"yarn:yarn.nodemanager.log.retain-seconds", "259200"
}
我得到的最接近的是:
cat << EOF > ./file.yaml
> # This is a comment
> # This is another comment
>
>
> spark:spark.ui.enabled: 'false'
> spark:spark.sql.adaptive.enabled: 'true'
> yarn:yarn.nodemanager.log.retain-seconds: '259200'
> EOF
echo {$(cat file.yaml | grep -o '^[^#]*' | sed '/^$/d' | awk -F": " '{sub($1, "\"&\""); print}' | paste -sd "," - )}
除了看起来相当粗糙并没有给出正确答案之外,它返回:
{"spark:spark.ui.enabled": 'false',"spark:spark.sql.adaptive.enabled": 'true',"dataproc:dataproc.monitoring.stackdriver.enable": 'true',"spark:spark.submit.deployMode": 'cluster'}
如果我通过管道传送到jq 会导致解析错误。
我希望我错过了一种更简单的方法,但我无法弄清楚。有人可以帮忙吗?
【问题讨论】:
-
原谅我的天真,我认为这些工具是 bash 的一部分,很高兴得到纠正。我受到运行它的 docker 映像中可用工具的限制,该映像是从 debian 基础构建的。
-
构建一个新的 docker 镜像,其中包含使用 YAML 和 JSON 所需的工具。
-
我只是想处理那个特定的输入,也许提到 yaml 是一个流浪汉。我确实有
jq可用 -
也有整数。我已经编辑了上面的示例以反映这一点
-
如果您习惯于
jq,那么还有一个名为yq的包装器可以处理YAML:yq.readthedocs.io/en/latest