我正在尝试将包含key = value对的文件转换为JSON。此文件可能包含Windows (\r\n)和空行。
给定以下输入(请注意空行):
foo = aa
bar = bb
qux = cc
white space = white space
* = special-char这是预期的结果:
{
"foo": "aa",
"bar": "bb",
"qux": "cc",
"white space": "white space",
"*": "special-char"
}我设法走了这么远:
{
"foo": "aa"
}
{
"bar": "bb"
}
{
"qux": "cc"
}
{
"white space": "white space"
}
{
"*": "special-char"
}使用以下命令:
jq --raw-input 'split("\n") | map(split(" = ") | { (.[0]): .[1] }) | .[]' 但我找不出缺失的地方。缺少的是什么,还是这是实现这一目标的更好方法?
编辑:添加了对空行和Windows的约束
发布于 2020-05-14 10:16:03
你们真的很亲密。将\r放在末尾,由=拆分,将结果数组转换为对象,将它们放入数组并传递给add。
[ inputs
| gsub("\r$"; "")
| split(" = "; "")
| select(length == 2)
| {(.[0]): .[1]}
] | add您需要在命令行上指定--raw-input/-R和--null-input/-n选项,这样才能工作。
发布于 2020-05-14 22:00:07
如果其中一个“值”包含"=“,那么使用split("=")天真地会产生不正确的结果。如果您的jq支持capture,那么这里有一个解决方案可以避免这个问题:
jq -nR '
def trim: sub("^ +";"") | sub(" +$";"");
[inputs
| select(index("="))
| sub("\r$"; "")
| capture( "(?<key>[^=]*)=(?<value>.*)" )
| ( (.key |= trim) | (.value |= trim)) ]
| from_entries'https://stackoverflow.com/questions/61794706
复制相似问题