如果可能的話,我在互聯網上找不到解決方案。
我有 JSON 檔案:
{
"ReferenceNumber": "d4fd41850323d2f6000000b013016327",
"TimeoutInSec": 900,
"RequestToUploadFileList": [
{
"BlobName": "8377ed3d-1b05-4c76-b718-6fddd46fd298",
"FileName": "jpk_vat_100-01.xml.zip.aes",
"Url": "https://taxdocumentstorage09tst.blob.core.windows.net/d4fd41850323d2f6000000b013016327/8377ed3d-1b05-4c76-b718-6fddd46fd298?sv=2015-07-08&sr=b&si=d4fd41850323d2f6000000b013016327&sig=yFXyJdsPPkbE0iQwVs5ccLEYEU0lxQHldbVyPfPciXw=",
"Method": "PUT",
"HeaderList": [
{
"Key": "Content-MD5",
"Value": "eXkPLHMM dHB5GCFoeAvsA=="
},
{
"Key": "x-ms-blob-type",
"Value": "BlockBlob"
}
]
},
{
"BlobName": "0a80a089-bc10-41e1-a74d-70fd45f27aa3",
"FileName": "jpk_vat_100-02.xml.zip.aes",
"Url": "https://taxdocumentstorage09tst.blob.core.windows.net/d4fd41850323d2f6000000b013016327/0a80a089-bc10-41e1-a74d-70fd45f27aa3?sv=2015-07-08&sr=b&si=d4fd41850323d2f6000000b013016327&sig=Fj+Gjn7hCKIM6hSvMBGWBxSOyV7V/LMM9pnenbaoxks=",
"Method": "PUT",
"HeaderList": [
{
"Key": "Content-MD5",
"Value": "NZew85QTb16mFLzx9cyKzA=="
},
{
"Key": "x-ms-blob-type",
"Value": "BlockBlob"
}
]
}
]
}
我想RequestToUploadFileList[0].Url分成兩部分:之前?sv=和剩余的字串。
我正在嘗試使用 Windows 命令列將其轉換為其他 JSON
c:\EJPK\exe>type "c:\TEMP\jpk1012\out\JPK_VAT.xml.sig.resp"| d:\curl\send\bin\jq-win32.exe -r "{ReferenceNumber:.ReferenceNumber} {URI:(.RequestToUploadFileList[0].Url)} {URI_ABS:.RequestToUploadFileList[0].Url[0:.RequestToUploadFileList[0].Url|index("?sv=")] } {URI_SAS:.RequestToUploadFileList[0].Url[.RequestToUploadFileList[0].Url|index("?sv="):] } {FILE:.RequestToUploadFileList[0].FileName} {Key:.RequestToUploadFileList[0].HeaderList[0].Value}"
我正在使用在jqplay.org 上測驗的公式。
顯然問題出在過濾器連接或將字串放入 INDEX 過濾器中:
.RequestToUploadFileList[0].Url|index("?sv=")
使用 jqplay.org 構建的源/原始公式:
jq '{ReferenceNumber:.ReferenceNumber}
{URI:(.RequestToUploadFileList[0].Url)}
{URI_ABS:.RequestToUploadFileList[0].Url[0:.RequestToUploadFileList[0].Url|index("?sv=")] }
{URI_SAS:.RequestToUploadFileList[0].Url[.RequestToUploadFileList[0].Url|index("?sv="):] }
{FILE:.RequestToUploadFileList[0].FileName}
{Key:.RequestToUploadFileList[0].HeaderList[0].Value}'
uj5u.com熱心網友回復:
您遇到問題是因為您沒有遵循 Windows/DOS 命令列的參考規則。如果您使用 jq 的 -f 命令列選項,您可能會發現事情更簡單,這使得所有這些問題都消失了。您遇到這些問題是因為您的 jq 程式包含雙引號。
另請注意:
- jq 的過濾器名稱區分大小寫,因此
INDEX和index完全不同; - 如果要使用
index,最好只使用一次,也許將其存盤為 jq 變數; - 通過“提升”可以大大簡化您的 jq 程式
.RequestToUploadFileList[0]:
{ReferenceNumber:.ReferenceNumber}
(.RequestToUploadFileList[0]
| (.Url|index("?sv=")) as $ix
| {URI:.Url,
URI_ABS: .Url[0:$ix],
URI_SAS: .Url[$ix:],
FILE: .FileName,
Key: .HeaderList[0].Value } )
為了健壯性,您可能希望處理 $ix 為空的情況。
除了使用
index,您可能希望考慮使用capture:
(.Url|capture( "(?<head>.*)(?<tail>\\?sv=.*)" )) as $url ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/360574.html
