ほしい要素だけ抜き出す
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",
}
ほしい要素はtextとid_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 で置換する