web-dev-qa-db-ja.com

bashで行をjsonに変換する

リストをJSON配列に変換したいと思います。私はこれについてjqを調べていますが、ほとんどの例はJSONの解析に関するものです(JSONの作成ではありません)。適切なエスケープが発生することを知っておくとよいでしょう。私のリストは単一行の要素なので、新しい行がおそらく最高の区切り文字になります。

17
jcalfee314

また、一連の行をJSON配列に変換しようとしていましたが、そのことに気づくまで-sは、改行を手動で解析する必要があったとしても、jq式で一度に複数の行を処理できる唯一の方法でした。

jq -R -s -c 'split("\n")' < just_lines.txt
  • -R生の入力を読み取る
  • -sすべての入力を単一の文字列として読み取る
  • -c出力をきれいに表示しない

簡単な簡単。

編集:私はjq≥1.4を使用しています。これは、splitビルトインが導入されたときのようです。

27
chbrown

_jq -R ._を使用して各行をJSON文字列としてフォーマットし、次に_jq -s_(_--Slurp_)を使用して、JSONとして解析した後、入力行の配列を作成することもできます。

_$ printf %s\\n aa bb|jq -R .|jq -s .
[
  "aa",
  "bb"
]
_

Chbrownの回答のメソッドは、入力が改行で終わっている場合、空の要素を最後に追加しますが、printf %s "$(cat)"を使用して、末尾の改行を削除できます。

_$ printf %s\\n aa bb|jq -R -s 'split("\n")'
[
  "aa",
  "bb",
  ""
]
$ printf %s\\n aa bb|printf %s "$(cat)"|jq -R -s 'split("\n")'
[
  "aa",
  "bb"
]
_

入力行にASCII制御文字(有効なJSONの文字列でエスケープする必要がある)が含まれていない場合)は、sedを使用できます。

_$ printf %s\\n aa bb|sed 's/["\]/\\&/g;s/.*/"&"/;1s/^/[/;$s/$/]/;$!s/$/,/'
["aa",
"bb"]
_
9
nisetama

--raw-input、次に--Slurp

他の人が言ったことを要約して、うまくいけばフォームをより早く理解できるようにしてください:

cat /etc/hosts  | jq  --raw-input .  | jq --Slurp .

あなたを返します:

[
  "fe00::0 ip6-localnet",
  "ff00::0 ip6-mcastprefix",
  "ff02::1 ip6-allnodes",
  "ff02::2 ip6-allrouters"
]

説明

 --raw-input/-R:

       Don´t parse the input as JSON. Instead, each line of text is passed
       to  the  filter  as  a  string.  If combined with --Slurp, then the
       entire input is passed to the filter as a single long string.

 --Slurp/-s:

       Instead of running the filter for each JSON object  in  the  input,
       read  the entire input stream into a large array and run the filter
       just once.
5

更新:jqにinputsがある場合は、次のように書くだけです。

jq -nR [inputs] /etc/hosts 

文字列のJSON配列を生成します。これにより、テキストファイル全体を読み取る必要がなくなります。

3
peak

私はjqのmanページで、実験を通して私にはより簡単な答えであると思われるものを見つけました。

$ cat test_file.txt | jq -Rsc '. / "\n" - [""]'
["aa","bb"]

-Rはjsonを解析せずに読み取るためのもので、-sはすべての入力を1つの文字列として読み取るように指示し、-cは1行の出力用です-必要ではありませんが、私が探していたものです。

次に、jqに渡す文字列で「。」入力をそのまま取ると言います。 '/\n'は、改行で文字列を分割する(分割する)ことを示します。 '-[""]'は、結果の配列から空の文字列を削除することを示しています(末尾の余分な改行の結果)。

これは1行であり、単純な組み込みのjq機能を使用するだけで、複雑な構成はありません。

2
Corey Woodfield