私はこれを大きな入れ子になったファイルを解析する効率的な方法jq
として使います。時には、次のようにキーと値を二重引用符の代わりに一重引用符で囲んだ形式のファイルが必要json
です。jq
json
{
'aggs': {
'two': {
'composite': {
'size': 700
}
}
}
}
これは実際の形式とは見なされませんが、json
jqにこのファイルを読み取るために設定できるパラメータがあるかどうか疑問に思います。それ以外の場合、このファイルは読み取れません。
そうでない場合は、Linuxですべての単一引用符を二重引用符に置き換えて読み取ることができる最も効率的な方法は何ですか?jq
答え1
通常、キーまたは文字列に一重引用符を使用することは破壊的です。JSON形式の仕様しかし、私たちは文書をリテラル(二重引用符で囲まれた)文字列を含むYAML文書として解釈することができます。
マイクパラyq
これをYAML(下記の注意事項を含む)に解析して標準JSONに変換できます。
$ yq -oj eval . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
'1"2'
正しく変換されますが"1\"2"
処理されません'1\'2'
(エラーが発生しますが、その文字列はYAMLでも無効な文字列なので、これは驚くべきことではありません)。バックスラッシュは一重引用符で囲まれたYAML文字列の'1\"2'
リテラルなので"1\\\"2"
。
\n
バックスラッシュはリテラルバックスラッシュなので、他のエンコードされた値を含む文字列(たとえば、エンコードされたリテラルの改行またはエンコードされたリテラルタブ)では、目的の操作を実行できない可能性があります。平和\t
のために別々に変換してください。\\n
\\t
アンドレイ・キースリュークyq
(これはのラッパーですjq
) Mikeのものと同じ制限事項と注意事項があるようですyq
。
$ yq . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
スティーブン・レビンyj
、YAMLからJSONにデータを変換するためにも使用できます。
$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}
答え2
これらのファイルでjsonのように引用符がエスケープ(プレフィックス)されている場合は、\
ドキュメントを提供する前に引用符を次のように翻訳できます。tr
jq
cat file_with_single_quotes | tr "'" '"' | jq ...
それとももっと簡単です:
tr "'" '"' < file_with_single_quotes | jq ...
質問のテキスト:
$ tr "'" '"' < file_sq | jq .aggs.two
{
"composite": {
"size": 700
}
}