phoenix-powerjqparse error: Invalid string: control characters from U+0000-through-U+001F must be escaped atのエラーが出る場合の対処法

どうやら要素における改行が認められなくなったようで、jq 1.5がこのようなエラーを出します。要素中に改行を入れたい場合は、jq 1.4を使いましょう。

1
2
3
4
5
6
7
8
9
10
echo '
[{
  "title" : "mba-hack",
  "post" : "
    js error!!
    U+0000-through-U+001F
  "
}]
' | jq .
parse error: Invalid string: control characters from U+0000-through-U+001F must be escaped at line 3, column 23

したがって、改行をjqを使う前に改行コードに置換しておくのが一番妥当な処理ですが、改行というのはとても面倒なものです。

たとえば、sedで変換するにしても、Linuxでの\nやMacでの\rがそのままでは効きません。

1
2
3
4
#linux
$ sed -e ':loop; N; $!b loop; s/\n/\\n/g' test.json
#mac
$ sed -e :loop -e 'N; $!b loop' -e 's/\n/\\\n/g' test.json

jq 1.5では、このような置換を使って一旦改行を改行を改行コードに書き換える必要がでてきます。

以下、サンプルファイルを使った実演です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ちなみに1.4でも要素外の改行コードの使用は認められない
$ cat test.json
[{"title" : "mba-hack",
    "post" : "
    js error!!
    U+0000-through-U+001F
"}]

#linux
$ sed -i -e ':loop; N; $!b loop; s/\n/\\n/g' test.json
#mac
$ sed -i "" -e :loop -e 'N; $!b loop' -e 's/\n/\\\n/g' test.json

$ cat test.json
[{"title" : "mba-hack","post" : "\n    js error!!\n    U+0000-through-U+001F\n    "}]

$ cat test.json | jq .
[
  {
    "test": "mba-hack",
    "post": "\n    js error!!\n    U+0000-through-U+001F\n    "
  }
]