Json 为什么我的jq/read/echo管道会删除反斜杠?
我正在尝试将一个大的JSON文件(~4百万个元素)拆分为单独的文件(每个元素一个文件) 文件有点像这样: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 }, {
{
"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: \"\"