json - 在 bash 脚本中,如何删除 JSON 数据集 {} 中双引号之间的所有双引号

标签 json linux bash

我有一个包含不动产记录的 20GB JSON 文件。

示例片段

{"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"}

最佳答案

删除反斜杠的不是echo命令,而是read命令。
请尝试:

while IFS= read -r line; do
    if [[ $line == *"\\\"country_code\\\":\\\"US\\\","* ]]; then
        echo "$line" >> "$JSON_FILE_FILTERED"
    fi
done < "$JSON_FILE"
  • 您需要将-r 选项添加到read 以保留反斜杠 作为生产线的一部分。
  • 在 [[ 和 ] 之间有一个不必要的左括号 (。(打字错误?)
  • 您需要转义 [[ 和 ] 之间的反斜杠。
  • 您需要用双引号将变量括起来。

然而,使用bash脚本读取20GB的文件仍然是低效的。
最好说:

grep -F '"\"country_code\":\"US\","' file.json > filtered.json

希望这对您有所帮助。

关于json - 在 bash 脚本中,如何删除 JSON 数据集 {} 中双引号之间的所有双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58274983/

相关文章:

javascript - 迭代 jQuery 格式化 JSON 不正确

linux - copy_to_user 在 linux 内核版本 4.12.8 中未定义

php - 如何使用 ODBC+FreeTDS 从 UNIX 中的 PHP 连接到 sybase?

bash 真/假重定向错误

javascript - 为 Angular ng-repeat 添加一个计数器?

javascript - Angular 指令中的处理范围对象

c# - 在 Windows 和 Linux 上部署时异步 TcpClient 连接不同

bash - UNIX 统计时间格式

bash - 如何从 bash 脚本循环运行带参数的 curl 命令?

json - 使用 Bash shell 提取 JSON 对象?