我有一个shell脚本,我想从中使用regex访问Json键的值。我知道我们应该使用JQ,但问题是,在我的应用程序中,文件的格式没有固定,它可以是xml或Json,因此我想使用regex。所以为了编写脚本,我将传递两个东西,文件名和regex命令。
现在的问题是,我不知道如何使用regex获取特定的密钥数据。
abc.json
{
"name": "marsh",
"address":[{"house_no":123,"Landmark":"Opp. to starbucks","mobile_no":{}}]
}
现在我只想在一个变量中获取house_no的值,在另一个变量获取Landmark的值,但我不知道如何实现。我一直在使用jq来获取脚本中的json数据,但现在我想使用regex 来获取
文件名将是abc.json,我想知道regx命令我的shell脚本是
house_num=$(cat abc.json | jq -r '.name')
所以我想把它转换成
house_num=$(cat$filename | sed$regx_command(mobile_num=$(cat$filename | sed$regx_command(
或house_num = $(cat $filename | grep $regx_command) mobile_num = $(cat $filename | sed $regx_command)
我尝试了几个正则表达式,但它们返回了整个地址数组。我不希望house_num的值仅为123。
我们有什么办法可以做到这一点吗?PS-我必须使用正则表达式,因为这是必需的。
我尝试了几个正则表达式。但我在那里得到了很多比赛,而不仅仅是一个值。我对这一切都很陌生,所以很困惑。
我试过这个
/.*?"id": (d+).*?("exclusions": [.*?|"desig").*?{/gs
在这个json 上
{
"id": 5229,
"Type": B,
"exclusions": [
{
"id": 3486,
"desig": "A",
"price": 101,
},
{
"id": 3489,
"desig": "A",
"price": 101,
}]},
{
"id": 5239,
"Type": B,
"exclusions": []
}
但它与一堆值相匹配,而不仅仅是设计的值
很高兴看到您最近开始提问了!我强烈建议你看看这篇文章:https://stackoverflow.com/help/how-to-ask
我真的不确定你的具体问题,因为在你的帖子中有多个问题似乎与另一个没有关联。这就是为什么我只会回答我理解的问题,希望你能给我一些缺失的反馈,如果我能帮助你的话:(
Q1:在json中获取house_no和Landmark的值
我建议您使用两个不同的匹配组,一个用于house_no,另一个用于Landmark值。通过这种方式,您可以清楚地为每个条件指定匹配条件,只需将它们与OR(|(连接即可。
为了匹配特定的值,您应该使用lookahead和lookbehinds。有了这些,您可以清楚地指定匹配条件,而不会在结果中包含整个匹配。
作为展望,我会使用";house_no";以及";Landmark";作为获得正确值的引用和后备项,我会使用一个负字符匹配子句,它匹配除指定字符外的所有字符。
结合这些方法,我得到了以下正则表达式:
((?<="house_no":)[^,]+)|((?<="Landmark":")[^"]+)
Q2:匹配desig的值
使用与Q1中相同的方法,我们得到以下正则表达式:
((?<="desig": ")[^"]+)
希望我能帮助你,如果是这样的话,请把这篇文章标记为你问题的答案:(