jq 以一种本身可以读取的方式输出路径的方法?
A way for jq to output paths in a way itself can read?
有没有办法使 jq
输出路径本身可以读取?
示例输入:
{
"foo": [{
"bar": 2,
"bor": 3
}]
}
输出"bar"的位置和值,例如:
jq -c 'tostream | select(.[0]|index("bar"))'
[["foo",0,"bar"],2]
有没有办法以 jq
路径选择格式输出路径,即 .foo[0].bar
?
据我所知,没有内置的方法可以做到这一点,但推出实施应该不会花费太多时间。
只有三种情况你需要担心:路径为空,路径包含字符串,路径包含数字。
如果为空,则仅指输入本身。如果它是一个字符串,它就是一个对象的 属性 。如果它是一个数字,它就是一个数组的索引。
所以你可以使用这个:
def to_expression($path): $path |
if length == 0
then "."
else map(
if type == "string"
then ".\"\(.)\""
elif type == "number"
then "[\(.)]"
else
error("unexpected path type: \(type)")
end
) | add
end;
请注意,这始终将 属性 名称括在引号中。这不是严格要求的,但比试图弄清楚是否真的需要它更容易。
jq 可以 读取指定为 JSON 数组的路径。具体参见 getpath
和 setpath
。 fromstream
也读取数组格式的路径。
有没有办法使 jq
输出路径本身可以读取?
示例输入:
{
"foo": [{
"bar": 2,
"bor": 3
}]
}
输出"bar"的位置和值,例如:
jq -c 'tostream | select(.[0]|index("bar"))'
[["foo",0,"bar"],2]
有没有办法以 jq
路径选择格式输出路径,即 .foo[0].bar
?
据我所知,没有内置的方法可以做到这一点,但推出实施应该不会花费太多时间。
只有三种情况你需要担心:路径为空,路径包含字符串,路径包含数字。
如果为空,则仅指输入本身。如果它是一个字符串,它就是一个对象的 属性 。如果它是一个数字,它就是一个数组的索引。
所以你可以使用这个:
def to_expression($path): $path |
if length == 0
then "."
else map(
if type == "string"
then ".\"\(.)\""
elif type == "number"
then "[\(.)]"
else
error("unexpected path type: \(type)")
end
) | add
end;
请注意,这始终将 属性 名称括在引号中。这不是严格要求的,但比试图弄清楚是否真的需要它更容易。
jq 可以 读取指定为 JSON 数组的路径。具体参见 getpath
和 setpath
。 fromstream
也读取数组格式的路径。