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

时间:2018-07-20 20:46:12

标签: regex linux bash sed

我有一个json文件

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

我想将其更改为

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

即将requestId从String转换为Integer。我已经尝试了一些方法,但是似乎都没有用:

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

有人可以帮我吗?

4 个答案:

答案 0 :(得分:3)

尝试

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]*来查找任意数量的数字(零个或多个数字)。

  • 如果要从替换字符串中的搜索中复制字符序列,则需要定义一个组,在正则表达式中以\(开头,以\)结尾然后在替换字符串中使用\1,在其中插入字符串。如果有多个组,则将\1用于第一个组,将\2用于第二个组,依此类推。

还要注意,最后一个g之后的最后一个/用于在所有已处理的行中的所有匹配项中应用此替换。没有该g,替换将仅应用于每个处理行中的第一个匹配项。因此,如果仅希望每行替换一次,则可以删除该g

答案 1 :(得分:2)

由于您说的是“或任何其他工具”,所以我建议您使用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"}

答案 2 :(得分:1)

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

你很近。我必须添加的“新”正则表达式术语:\1表示“在“搜索”端的第一个\( \)中包含的内容,\+表示“前一个或多个东西”。

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

答案 3 :(得分:1)

也许jq (json query)工具可以帮助您吗?

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