地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【手元メモ】jqチートシート

ほしい要素だけ抜き出す

jq '{name, description}'

指定した複数の要素をスペース区切りの文字列として出力する

jq -r '"\(.id_str) \(.text)"' < file

文字列のエスケープを解除して出力する

  • -rオプションを使う
$ echo '{"key": "value\n\"aaaa\""}' | jq .key
"value\n\"aaaa\""
$ echo '{"key": "value\n\"aaaa\""}' | jq -r .key
value
"aaaa"

素の文字列を1行ずつJSON文字列にエスケープする

  • -Rを使う
$ printf '"aaa\nbbb cccc\tdddd' | jq -R
"\"aaa"
"bbb cccc\tdddd"

複数行の素の文字列を1つのJSON文字列にエスケープする

  • -R--slurpを使う
$ printf '"aaa\nbbb cccc\tdddd'
"aaa
bbb cccc    dddd
$ printf '"aaa\nbbb cccc\tdddd' | jq -R --slurp
"\"aaa\nbbb cccc\tdddd"

文字列に改行が含まれているJSONを扱う

例として以下のようなJSONがあったとします。

{
  "text": "遅れた!今描いた。\n\n#key\n#Kanon\n#水瀬名雪誕生祭\n#水瀬名雪誕生祭2019\n#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI",
  "id_str": "1209146623982366720",
  "source": "<a href=\"http://twitter.com/#!/download/ipad\" rel=\"nofollow\">Twitter for iPad</a>",
  "created_at": "Mon Dec 23 16:19:54 +0000 2019",
}

ほしい要素はtextid_strです。 安直に、jq -r '"\(.id_str) \(.text)"'とやると、

$ cat tweet.json | jq -r '"\(.id_str) \(.text)"'
1209146623982366720 遅れた!今描いた。

#key
#Kanon
#水瀬名雪誕生祭
#水瀬名雪誕生祭2019
#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI

このように\nがunescapeされてしまうので改行がはいってしまいます。

そこで、textに含まれる\n\x1fに置き換えることにしました。

#!/bin/sh

RS="$(printf '\x1e')"
US="$(printf '\x1f')"

cat tweet.json                        |
jq -r '"\(.id_str) \(.text)'${RS}'"'  | # text の末尾にRSをつける
tr '\n' ${US}                         | # \n をUSで置換する
sed 's/'${RS}${US}'/'${RS}'/g'        | # RSとUSが連続している箇所をRSで置換する
tr -d '\n'                            | # grepが出力した末尾の \n を除去する
tr ${RS} '\n'                           # RSを \n で置換する