Bash脚本使用sed迭代文件并删除文本块

时间:2018-04-23 10:26:36

标签: json bash shell sed

我有一个包含以下内容的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
任何帮助表示赞赏!

1 个答案:

答案 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"
},
]