Sed在特定json键后面的json文本周围添加引号



我有以下格式错误的json文件。我想引用email的值,即"sampleemail@sampledoman.co.org"我该怎么做呢?我在下面试过了,但是没有用。

sed -e 's/"email":[(.*)]/"email":["1"]/g' sample.json
  • 样本。json如下所示
{
"supplementaryData": [
{
"xmlResponse": {
"id": "100001",
"externalid": "200001",
"info": {
"from": "C1022929291",
"phone": "000963586",
"emailadresses": {
"email": [sampleemail@sampledoman.co.org
]
}
},
"status": "OK",
"channel": "mobile"
}
}
]
}

你的代码不能工作,因为

  • [没有转义,因此不被视为文字
  • 您正在使用BRE,因此捕获括号需要转义。在当前格式下,您需要-E使用扩展功能
  • 行不以]
  • 结尾
  • 您没有添加空格,所以没有匹配,因此没有替换。

为了让你的代码正常工作,你可以使用;

$ sed -E 's/"email": [(.*)/"email": ["1"/' sample.json

$ sed -E '/<email>/s/[a-z@.]+$/"&"/' sample.json
{
"supplementaryData": [
{
"xmlResponse": {
"id": "100001",
"externalid": "200001",
"info": {
"from": "C1022929291",
"phone": "000963586",
"emailadresses": {
"email": ["sampleemail@sampledoman.co.org"
]
}
},
"status": "OK",
"channel": "mobile"
}
}
]
}

使用您显示的示例,请尝试遵循awk代码。在GNUawk中编写和测试。使RS为NULL并使用awk的函数命名为match,其中我使用regex(.*)(n[[:space:]]+"emailadresses": {n[[:space:]]+"email": [)([^n]+)(.*)获得所需的输出,即创建4个捕获组,其中4个不同的值进入名为arr的数组(GNUawkmatch函数中的功能将捕获的值保存到数组中),然后根据要求打印值(在电子邮件地址值之前和之后添加",这是arr的第3个元素或regex的第3个捕获组)。

awk -v RS= '
match($0,/(.*)(n[[:space:]]+"emailadresses": {n[[:space:]]+"email": [)([^n]+)(.*)/,arr){
print arr[1] arr[2] """ arr[3] """ arr[4]
}
'  Input_file