我有一个包含以下内容的JSON文件:
[
{
"url" : "www.google.com",
"valid_from" : " Jul 31 10:16:13 2017 GMT",
"valid_till" : " Jul 31 10:16:13 2019 GMT",
"validity" : "Valid",
"days" : "464"
},
{
"url" : "www.youtube.com",
"valid_from" : " Apr 9 12:12:17 2017 GMT",
"valid_till" : " Apr 9 12:12:17 2019 GMT",
"validity" : "Valid",
"days" : "351"
}
]
我想通过传递与要删除的块对应的url参数来删除JSON块。
我有一个脚本cert-check-script-delete.sh
,其中包含以下代码:
line_num=1
cat certs.json >> certs-new.json
while read p; do # Iterate through each line in certs.json
if [[ $p == *"$1"* ]]; # Check if current line contains argument
then
sed -i "${line_num-1}d" certs-new.json # {
sed -i "${line_num}d" certs-new.json # Url
sed -i "${line_num+1}d" certs-new.json # Valid from
sed -i "${line_num+2}d" certs-new.json # Valid till
sed -i "${line_num+3}d" certs-new.json # Validity
sed -i "${line_num+4}d" certs-new.json # Days
sed -i "${line_num+5}d" certs-new.json # }
break
fi
((line_num++))
done <certs.json
mv certs-new.json certs.json
在使用参数www.youtube.com
运行我的脚本之后,我发现它似乎只是删除随机行的奇怪行为:
{
"valid_from" : " Jul 31 10:16:13 2017 GMT",
"validity" : "Valid",
{
"valid_till" : " Apr 9 12:12:17 2019 GMT",
"validity" : "Valid",
"days" : "351"
}
]
我知道我应该使用jq
来插入/删除JSON,但我无法在工作中安装它,所以请不要只评论使用jq
。
任何帮助表示赞赏!
答案 0 :(得分:1)
你可以这样做: -
sed -i '/www.youtube.com/I,+6 d;$!N;/www.youtube.com/!P;D' certs-new.json
如果您的搜索字符串已作为命令行参数提供,请使用
sed -i '/'$1'/I,+6 d;$!N;/'$1'/!P;D' certs-new.json
如何工作,首先它将搜索模式www.youtube.com
并删除模式下方的6行,sed
命令的第二部分将搜索模式www.youtube.com
并删除模式行在它上面一行。
在您的示例中,输出将为: -
[
{
"url" : "www.google.com",
"valid_from" : " Jul 31 10:16:13 2017 GMT",
"valid_till" : " Jul 31 10:16:13 2019 GMT",
"validity" : "Valid",
"days" : "464"
},
]