为什么我的jq / read / echo管道删除反斜杠?

问题描述 投票:1回答:2

我正在尝试将一个较大的JSON文件(〜4个Mio元素)拆分为单独的文件(每个元素一个文件)。

文件有点像这样:

{
  "books": [
    {
      "title": "Professional JavaScript - \"The best guide\"",
      "authors": [
        "Nicholas C. Zakas"
      ],
      "edition": 3,
      "year": 2011
    },
    {
      "title": "Professional JavaScript",
      "authors": [
        "Nicholas C.Zakas"
      ],
      "edition": 2,
      "year": 2009
    },
    {
      "title": "Professional Ajax",
      "authors": [
        "Nicholas C. Zakas",
        "Jeremy McPeak",
        "Joe Fawcett"
      ],
      "edition": 2,
      "year": 2008
    }
  ]
}

为了将每本书分成一个单独的文件,我使用以下命令:

cat books.json | jq -c -M '.books[]' | while read line; do echo $line > temp/$(date +%s%N).json; done

对于最后两项,一切正常,因为书名不包含任何引号。但是,在第一个中,\""替换,这导致损坏的JSON文件,因为随后的解析器-当然-将"解释为元素的边界。

我尝试使用jq -r,但这没有帮助。

我正在使用CentOS 7附带的jq版本:

[root@machine]$ jq --version
jq-1.6

有什么建议吗?

json jq quotes
2个回答
1
投票

您必须对-r使用read选项:

read

它防止解释反斜杠转义。

并且您应该引用变量。

查看区别:

while read -r line; do echo "$line" > temp/"$(date +%s%N)".json; done

几乎总是需要将$ read var <<< 'quoted quotes: \"\"' $ echo "$var" quoted quotes: "" $ read -r var <<< 'quoted quotes: \"\"' $ echo "$var" quoted quotes: \"\" -r一起使用,并且实际上应该是默认的行为。


-1
投票

非常感谢,成功了!保存了我的一天!

© www.soinside.com 2019 - 2024. All rights reserved.