【发布时间】:2019-10-08 08:38:41
【问题描述】:
我有一个包含不动产记录的 20GB 大型 JSON 文件。
示例 sn-p
{"id":2545,"name":"No cribs (infant beds) available"},{"description": "Here is some text with a <a href=\"stupidurl.com\">click here</a>"}
我正在尝试在 bash 中使用 WHILE 循环逐行读取文件,并仅将我想要的数据提取到一个新的、较小的文件中以供以后处理。
while read line; do
#All this If Statement does is look for a pattern to identify the line I want to save
if [[ ($line == *"\"country_code\":\"US\","* ]]; then
echo $line >> $JSON_FILE_FILTERED
fi
done < $JSON_FILE
我的问题是 echo 语句删除了转义的引号。
href=\"mylink\"
变成……
href="mylink"
...在导致 JQ 解析错误的新 JSON 文件中。
我需要删除 JSON 括号中的双引号,或者在将转义的引号写入新文本文件时使用回显语句来保留它。
我尝试了 sed、tr 等 echo -e 和 printf 的各种迭代。主要是我没有运气。
现在我可以使用...删除标签之间的所有内容
echo $line | sed -e 's/<[^>]*>//g' >> $JSON_FILE_FILTERED
...这有点工作,但它不会更正数据括号内的其他双引号
{"description": "Here is some text with \"Some Big Guy's\" hat"}
{"description": "Here is some text with "Some Big Guy's" hat"}
【问题讨论】:
-
shellcheck 指出没有
-r的read将mangle backslashes -
尝试使用 'jq' 处理 JSON 文件。文件大小可能是一个挑战,但除非您确定输入是如何分成几行的,否则很难编写一个 bash 阅读器。如果您知道输入打印得很漂亮,bash
-
可以分享需要提取的示例行吗?