如何修剪所有的空格,除了那些在大JSON文件的引号

How to trim all spaces except those within quotes for large JSON file

本文关键字:那些 JSON 文件 空格 何修剪 修剪      更新时间:2023-09-26

我目前正在处理一个大型JSON文件,并希望通过删除所有不在引号内的额外空格,制表符,返回等来缩短它。该文件大约有100,000行代码,我的其他脚本很难快速使用它。文件最初看起来像:

{
  "path": "/math/", 
  "id": "math", 
  "title": "Math Title",       
  "icon_url": "/images/power-mode/badges/circles-40x40.png",   
  "contains": [
    "Topic", 
    "Video", 
   "Exercise"
  ], 
  "children": [], 
  "parent_id": "root",
  "ancestor_ids": [
    "root"
  ], 
  "description": "null", 
  "kind": "Topic", 
  "h_position": -10,
  "v_position": 6, 
  "slug": "math"
}

,我希望它在删除不必要的空格、制表符、返回符等后看起来像这样:

{"path":"/math/","id":"math","title":"Math Title","icon_url":"/images/power-mode/badges/circles-40x40.png",     
"contains":["Topic","Video","Exercise"],"children":[],"parent_id":"root","ancestor_ids":["root"],   
"description": "null","kind":"Topic","h_position":-10,"v_position":6,"slug":"math"}

基本上所有空格都应该删除,除了引号内的空格。

您可以使用jq的-c--compact-output选项:

jq -c '' < your-file.json
演示:

$ echo '
> {
>   "a": "b"
> }' | jq -c ''
{"a":"b"}

您可以将json读取为代码,然后将其输出到文件中指定紧凑格式,引号中的空格将保留在字符串中。

在python中你可以使用本地的json库

import json
json.loads(your filestream)
json.dumps(your output stream) // the native output of json.dumps is compact

python文档中的详细信息https://docs.python.org/2/library/json.html

但是你应该能够在任何处理json的语言中使用同样的技术

为什么不直接通过perl管道呢?

perl -0pe 's#((^[^"]+")|("[^"]+$)|("[^"]+")|(^[^"]+$))#($x=$1)=~s/'s+/ /g;$x#ge'
  • -0将字段分隔符设置为null,因此while(<>)将看到一个大行,并且您可以处理仅使用空白而不生成额外空格的多行。
  • -p将while(<>)打印位。
  • -e说这是我们要运行的perl代码。

代码基本匹配:

  • 在行首和第一个引号之间
  • 在最后一个引号和行尾之间。
  • 在两个引号之间,由于最后两个匹配将只包含引号之外的文本。
  • 或者没有引号的行。

然后用一个空格替换所有一组或多个空白字符。

基本上只替换引号之间的空格,稍加修改....

您可以在线使用JSON迷你器。在Google上搜索JSON minifier。谷歌

以下是JSON迷你器返回给我的内容:

{"path":"/math/","id":"math","title":"Math Title","icon_url":"/images/power-mode/badges/circles-40x40.png","contains":["Topic","Video","Exercise"],"children":[],"parent_id":"root","ancestor_ids":["root"],"description":"null","kind":"Topic","h_position":-10,"v_position":6,"slug":"math"}

你可以看到它没有删除引号之间的空格。例如"Math Title"