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

Json 为什么我的jq/read/echo管道会删除反斜杠?,json,jq,quotes,Json,Jq,Quotes,我正在尝试将一个大的JSON文件(~4百万个元素)拆分为单独的文件(每个元素一个文件) 文件有点像这样: { "books": [ { "title": "Professional JavaScript - \"The best guide\"", "authors": [ "Nicholas C. Zakas" ], "edition": 3, "year": 2011 }, {

我正在尝试将一个大的JSON文件(~4百万个元素)拆分为单独的文件(每个元素一个文件)

文件有点像这样:

{
  "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[]'|边读边读;执行echo$line>temp/$(日期+%s%N).json;完成
对于最后两项,一切正常,因为书名不包含任何引号。但是,在第一个示例中,
\“
替换,这导致一个损坏的JSON文件,因为随后的解析器(当然)将
解释为元素的边界

我尝试过使用
jq-r
,但是没有用

我使用的是CentOS 7提供的jq版本:

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


有什么建议吗?

您必须使用
-r
选项:

它防止解释反斜杠转义

你应该引用你的变量

请看区别:

$ read var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: ""
$ read -r var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: \"\"

$read var FYI,介绍了在读取时使用
循环的最佳实践。虽然它与
jq
没有太大区别,但最好摆脱使用
cat filename |……
的习惯;一些程序(包括
排序
尾部
)如果给他们一个真正的、可查找的文件句柄,而不是只能从前到后读取一次的FIFO(也称为管道),则可以运行得更快。这是否回答了您的问题?是否有另一个先前存在的候选者重复(标题不清楚,但在读取时是相同的
;do
错误)。
$ read var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: ""
$ read -r var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: \"\"