JMESPath 加入输出并去除不需要的字符
JMESPath join output and strip unwanted chars
我有以下 json;
[
{
"compartment-id": "CompartmentID-123",
"defined-tags": {},
"display-name": "Test-123",
"freeform-tags": {},
"id": "ID-ABC",
"kms-key-id": "",
"lifecycle-state": "ACTIVE",
}
]
我希望将 id
和 display-name
参数加入逗号分隔的字符串中,并去掉 "
和 []
,如下所示:
ID-ABC,Test-123
到目前为止我最接近的是:
oci fs file-system list -c $compart --availability-domain $ad --query 'data[].[id,"display-name"][]' | tr -d '" '
[
ID-ABC,
Test-123
]
想知道是否有一种更简洁的方法可以在 JMESPath 中完成所有这些操作,而无需将输出管道输出到 tr
、jq
、sed
或 awk
等
更新基于来自 β.εηοιτ.βε
的输入
这么近...
oci fs file-system list -c $compart --availability-domain $ad3 --query 'data[0].join(',', [id, "display-name"])'
Returns
ParseError: invalid token: Parse error at column 13, token "," (COMMA), for expression:
"data[0].join(,, [id, "display-name"])"
然而,我最好使用引号;
oci fs file-system list -c $compart --availability-domain $ad3 --query "data[0].join(',', [id, 'display-name'])"
Private key passphrase:
"ID-ABC,display-name"
我开始怀疑我的本地设置是否有问题或 shell,因此它被引号弄糊涂了?
既然你有一个数组,你首先需要定位数组的第一个元素,以摆脱它。由于数组是基于 0 的,因此可以通过以下方式轻松实现:
data[0]
这给出了
{
"compartment-id": "CompartmentID-123",
"defined-tags": {},
"display-name": "Test-123",
"freeform-tags": {},
"id": "ID-ABC",
"kms-key-id": "",
"lifecycle-state": "ACTIVE"
}
然后,为了创建您要查找的字符串,您可以使用 join
函数,该函数接受粘合字符和数组作为参数。
您可以使用 filters and multiselect lists:
轻松获得您要查找的数组
data[0].[id, "display-name"]
这给出了
[
"ID-ABC",
"Test-123"
]
现在我们只需要在所有这些之上应用 join
函数:
data[0].join(',', [id, "display-name"])
最后给出:
"ID-ABC,Test-123"
关于在 JMESPath 中引用的附加说明:
-
'some-string'
是 raw literal string 并且不会被解释
-
`some-string`
是 raw literal string 的另一种形式,不会被解释为
-
"some-string"
是 literal expression 并且将被解释为
所以:
data[0].join(',', [id, "display-name"])
和
data[0].join(`,`, [id, "display-name"])
是两个严格相等的查询。
同时
data[0].join(',', [id, 'display-name'])
具有完全不同的含义,并且会以字符串 display-name
作为数组的第二个元素结束,因此它将导致
"ID-ABC,display-name"
所有这些都基于 JSON 结构:
{
"data":[
{
"compartment-id":"CompartmentID-123",
"defined-tags":{},
"display-name":"Test-123",
"freeform-tags":{},
"id":"ID-ABC",
"kms-key-id":"",
"lifecycle-state":"ACTIVE"
}
]
}
我有以下 json;
[
{
"compartment-id": "CompartmentID-123",
"defined-tags": {},
"display-name": "Test-123",
"freeform-tags": {},
"id": "ID-ABC",
"kms-key-id": "",
"lifecycle-state": "ACTIVE",
}
]
我希望将 id
和 display-name
参数加入逗号分隔的字符串中,并去掉 "
和 []
,如下所示:
ID-ABC,Test-123
到目前为止我最接近的是:
oci fs file-system list -c $compart --availability-domain $ad --query 'data[].[id,"display-name"][]' | tr -d '" '
[
ID-ABC,
Test-123
]
想知道是否有一种更简洁的方法可以在 JMESPath 中完成所有这些操作,而无需将输出管道输出到 tr
、jq
、sed
或 awk
等
更新基于来自 β.εηοιτ.βε
的输入这么近...
oci fs file-system list -c $compart --availability-domain $ad3 --query 'data[0].join(',', [id, "display-name"])'
Returns
ParseError: invalid token: Parse error at column 13, token "," (COMMA), for expression:
"data[0].join(,, [id, "display-name"])"
然而,我最好使用引号;
oci fs file-system list -c $compart --availability-domain $ad3 --query "data[0].join(',', [id, 'display-name'])"
Private key passphrase:
"ID-ABC,display-name"
我开始怀疑我的本地设置是否有问题或 shell,因此它被引号弄糊涂了?
既然你有一个数组,你首先需要定位数组的第一个元素,以摆脱它。由于数组是基于 0 的,因此可以通过以下方式轻松实现:
data[0]
这给出了
{
"compartment-id": "CompartmentID-123",
"defined-tags": {},
"display-name": "Test-123",
"freeform-tags": {},
"id": "ID-ABC",
"kms-key-id": "",
"lifecycle-state": "ACTIVE"
}
然后,为了创建您要查找的字符串,您可以使用 join
函数,该函数接受粘合字符和数组作为参数。
您可以使用 filters and multiselect lists:
轻松获得您要查找的数组data[0].[id, "display-name"]
这给出了
[
"ID-ABC",
"Test-123"
]
现在我们只需要在所有这些之上应用 join
函数:
data[0].join(',', [id, "display-name"])
最后给出:
"ID-ABC,Test-123"
关于在 JMESPath 中引用的附加说明:
-
是 raw literal string 并且不会被解释'some-string'
-
是 raw literal string 的另一种形式,不会被解释为`some-string`
-
是 literal expression 并且将被解释为"some-string"
所以:
data[0].join(',', [id, "display-name"])
和
data[0].join(`,`, [id, "display-name"])
是两个严格相等的查询。
同时
data[0].join(',', [id, 'display-name'])
具有完全不同的含义,并且会以字符串 display-name
作为数组的第二个元素结束,因此它将导致
"ID-ABC,display-name"
所有这些都基于 JSON 结构:
{
"data":[
{
"compartment-id":"CompartmentID-123",
"defined-tags":{},
"display-name":"Test-123",
"freeform-tags":{},
"id":"ID-ABC",
"kms-key-id":"",
"lifecycle-state":"ACTIVE"
}
]
}