我想將檔案中的一些json與運行時生成的一些json合并。如果傳遞給它的所有檔案都是here-strings或系統中的檔案,jq似乎沒有什么困難。但如果我嘗試混合檔案型別,似乎here-strings被忽略了,請看下面的片段:
兩個正常的檔案:
<兩個普通檔案:
bash-4.2# echo '{"key":0}' > zero
bash-4.2# echo '{"key":1}' > one
bash-4.2# jq --slurp add zero one
{
"key": 1
}
正常檔案和here-string(只有正常檔案出現在結果中!):
bash-4.2# jq --slurp add zero <<< '{"key":1}'
{
"key"/span>: 0
}
首先是Here-string,然后是普通檔案(只有普通檔案出現在結果中!):
bash-4.2# jq --slurp add <<< '{"key":0, "otherkey":2}' one
{
"key"/span>: 1
}
單個here-string(作業正常):
bash-4.2# jq --slurp add <<< '{"key":0}'
{
"key"/span>: 0
}
兩個here-strings(作業正常):編輯:輸出是誤導性的,這里發生了其他的事情。
bash-4.2# jq --slurp add <<< '{"key":0}' << < '{"key":1}'
{
"key"/span>: 1
}
我懷疑jq作業得很好,我對bash如何解決here-strings一無所知。但是,我將如何除錯這個問題以提高我的理解?
注:一個非常簡單的變通方法是評估我的運行時json并產生一個檔案,然后如上所述合并這兩個檔案。我真的想知道為什么上面的粗體例子沒有產生我所期望的東西。
uj5u.com熱心網友回復:
在閱讀了評論之后,我的理解是:
<<<首先被shell評估并重定向stdin。如果jq在過濾后沒有收到任何位置引數,它就從stdin讀取。因此,所有這些陳述句都是等價的:
echo "{}"/span> | jq --slurp add
<<< {} jq --slurp add
jq <<< {}--slurp add
jq --slurp add <<< {} add
jq --slurp add <<< {}。
如果jq在過濾器之后確實收到了位置引數,它將它們解釋為檔案名。它遵守將-視為stdin的慣例。
bash-4.2# echo '{"one":1, "two":1}' > first
bash-4.2# echo '{"三":3}' > third
bash-4.2# jq --slurp add first - third <<< '{"two":2}'
{
"一": 1,
"二": 2,
"三": 3
}
uj5u.com熱心網友回復:
here-string結構只是重定向標準輸入。如果你以接收檔案名引數的方式呼叫它,你將分別需要告訴jq來讀取標準輸入。事實上這樣做的標準方法是指定-作為輸入(偽)檔案名。
我相信你的一個測驗案例實際上并沒有作業,只是看起來像作業了,因為輸入資料被構造成了一個無用的東西。
uj5u.com熱心網友回復:
一個想法是使用行程替換,本質上是為jq提供一個它可以使用的(臨時)檔案描述符。
使用awk來演示檔案描述符的想法:
$ awk '{print FILENAME}' < (echo 'abc')
/dev/fd/63
用你的幾個例子來演示:
$ jq --slurp add zero <(echo '{"key":1}'/span>)
{
"key": 1
}
$ jq --slurp add zero <(echo '{"keyx":1}'/span>)
{
"key": 0。
"keyx": 1
}
$ jq --slurp add <(echo '{"key":0, "otherkey":2}') one
{
"key": 1,
"otherkey": 2
}
$ jq --slurp add <(echo '{"key":0}'/span>) <(echo '{"key":1}'/span>)
{
"key": 1
}
$ jq --slurp add <(echo '{"key":0}'/span>) <(echo '{"keyx":1}'/span>)
{
"key": 0。
"keyx": 1
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/318115.html
標籤:
