我有一个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
有人可以帮我吗?
答案 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
$