代码之家  ›  专栏  ›  技术社区  ›  user2405589

使用sed(或任何其他工具)删除json文件中的引号

  •  -1
  • user2405589  · 技术社区  · 6 年前

    我有一个json文件

    {"doc_type":"user","requestId":"1000778","clientId":"42114"}
    

    我想把它改成

    {"doc_type":"user","requestId":1000778,"clientId":"42114"}
    

    即将requestId从字符串转换为整数我试过一些方法,但似乎都不管用:

    sed -e 's/"requestId":"[0-9]"/"requestId":$1/g' test.json
    sed -e 's/"requestId":"\([0-9]\)"/"requestId":444/g' test.json 
    

    有人能帮我吗?

    4 回复  |  直到 6 年前
        1
  •  3
  •   jme52    6 年前

    尝试

    sed -e 's/\("requestId":\)"\([0-9]*\)"/\1\2/g' test.json
    

    sed -e 's/"requestId":"\([0-9]*\)"/"requestId":\1/g' test.json
    

    与您的尝试的主要区别是:

    • 你的正则表达式正在寻找 [0-9] 在双引号之间,这是一个数字。通过使用 [0-9]* 相反,您要查找任意数量的数字(零位或更多位)。

    • 如果要在替换字符串中从搜索中复制一系列字符,则需要定义一个以 \( 还有决赛 \) 在regexp中,然后使用 \1 在替换字符串中插入字符串如果有多个组,则使用 \ 1个 对于第一组, \2 对于第二组,依此类推。

    还要注意最后 g 最后一次之后 / 用于在所有匹配项中、在每个处理的行中应用此替换。没有这个 ,替换将仅应用于每个处理行中的第一个匹配项因此,如果您希望每行只有一个这样的替换,那么您可以删除它 .

        2
  •  2
  •   penguin359    6 年前

    既然你说“或者其他工具”,我就推荐JQ!sed非常适合基于行的方式,json则不适合,有时添加新行只是为了更好地打印输出,使开发人员的生活更轻松。在处理字符串内容中的unicode或双引号时,规则也变得更加复杂。jq是专门为理解json格式而设计的,可以对其进行适当的剖析。

    对于您的情况,应该这样做:

    jq '.requestId = (.requestId | tonumber)'
    

    注意,如果缺少requestid并且没有输出json对象,这将抛出一个错误。如果这是一个问题,您可能需要一些更复杂的东西,例如下面的示例:

    jq 'if has("requestId") then .requestId = (.requestId | tonumber) else . end'
    

    而且,如果发送到终端,jq会打印并着色它的输出。为了避免这种情况,只需要看到一个紧凑的、每对象一行的格式,添加 -Mc 命令如果在输入中没有换行符的情况下背靠背地提供多个对象,jq也可以工作下面是显示此筛选器的完整演示:

    $ (echo '{"doc_type":"bare"}{}'
       echo '{"doc_type":"user","requestId":"0092","clientId":"11"}'
       echo '{"doc_type":"user","requestId":"1000778","clientId":"42114"}'
    ) | jq 'if has("requestId") then .requestId = (.requestId | tonumber) else . end' -Mc
    

    产生这种结果的:

    {"doc_type":"bare"}
    {}
    {"doc_type":"user","requestId":92,"clientId":"11"}
    {"doc_type":"user","requestId":1000778,"clientId":"42114"}
    
        3
  •  1
  •   jeremysprofile Subin George    6 年前
    sed -e 's/"requestId":"\([0-9]\+\)"/"requestId":\1/g' test.json
    

    你很亲密我不得不补充的“新”regex术语: \1 意思是“包含在第一个 \( \) 在“搜索”方面,以及 \+ 意思是“前一件事的一个或多个”。

    因此,我们搜索字符串 "requestId":" 后跟一组1个或多个数字,后跟 " ,并替换为 "requestId": 然后是我们之前发现的那群人。

        4
  •  1
  •   Virtual    6 年前

    也许是 jq (json query) 工具能帮你吗?

    $ cat test                                                  
    {"doc_type":"user","requestId":"1000778","clientId":"42114"}
    $ cat test |jq '.doc_type' --raw-output                     
    user                                                        
    $