我有以下格式错误的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
的数组(GNUawk
在match
函数中的功能将捕获的值保存到数组中),然后根据要求打印值(在电子邮件地址值之前和之后添加"
,这是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