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

Regex 使用sed(或任何其他工具)删除json文件中的引号,regex,linux,bash,sed,Regex,Linux,Bash,Sed,我有一个json文件 {"doc_type":"user","requestId":"1000778","clientId":"42114"} 我想把它改成 {"doc_type":"user","requestId":1000778,"clientId":"42114"} i、 e.将requestId从字符串转换为整数。我试过一些方法,但似乎都不管用: sed -e 's/"requestId":"[0-9]"/"requestId":$1/g' test.json sed -e 's/

我有一个json文件

{"doc_type":"user","requestId":"1000778","clientId":"42114"}
我想把它改成

{"doc_type":"user","requestId":1000778,"clientId":"42114"}
i、 e.将requestId从字符串转换为整数。我试过一些方法,但似乎都不管用:

sed -e 's/"requestId":"[0-9]"/"requestId":$1/g' test.json
sed -e 's/"requestId":"\([0-9]\)"/"requestId":444/g' test.json 
有人能帮帮我吗

sed -e 's/"requestId":"\([0-9]\+\)"/"requestId":\1/g' test.json
你很接近。我必须添加的新正则表达式术语:\1表示搜索端第一个\\中包含的内容,\+表示前一个内容的1个或多个

因此,我们搜索字符串requestId:后跟一组1或更多数字,后跟,并将其替换为requestId:后跟前面找到的组。

试试看

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

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

您的正则表达式在双引号之间寻找[0-9],这是一个位数。通过使用[0-9]*替换,您可以查找任意数量的零位数或更多位数

如果要在替换字符串中复制搜索中的字符序列,则需要在regexp中定义一个包含起始\和结束\的组,然后在替换字符串中使用\1将字符串插入其中。如果有多个组,则第一个组使用\1,第二个组使用\2,依此类推

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

也许该工具可以帮助您

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

既然你说了什么或者其他工具,我推荐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"}
{"doc_type":"bare"}
{}
{"doc_type":"user","requestId":92,"clientId":"11"}
{"doc_type":"user","requestId":1000778,"clientId":"42114"}