删除JSON文件中重复的1:M表示



我有大约700个JSON文件,存在重复的漏洞,如:

{
"vulnerabilities": [
}
{
"vulnerabilities": [
}

此json表示显示了正在发生的漏洞。我想在每个文件第一次出现漏洞{}后删除所有内容。因此,我希望每个json都用以下表示形式保存:

{
"vulnerabilities": [
}

我有一个循环:

for file in *.json; do
# logic
done

它循环当前所有json文件,并对它们进行逻辑处理。

如何在第一次出现vulnerabilities { }后删除每个json文件中的所有内容

如果您有有效的JSON,例如:

[
{
"vulnerabilities": [ {"issue":"root access"}, {"timestamp":"2021-04-19T20:27:23+00:00"} ]
},
{
"vulnerabilities": [ {"issue":"something else"}, {"timestamp":"2021-04-18:27:23+00:00"}]
}
]

如果您的系统上有jq,那么它很简单,如下所示:

jq '.[0]' vulnerabilities.json

获取:

{
"vulnerabilities": [
{
"issue": "root access"
},
{
"timestamp": "2021-04-19T20:27:23+00:00"
}
]
}

这将删除}之后的所有行:

for file in *.json; do
sed '/}/q' $file > $file.new
done

sed将在找到并打印第一个CCD_ 3之后退出。

每个缩短的文件都保存在$file.new.中

例如,

cat f2.json
{
"vulnerabilities": ["f2",1],
"happiness": ["good thing", 10] }
{
"vulnerabilities": ["f2",2]
}
{
"vulnerabilities": ["f2",3] }

将生成一个文件f2.json.new

{
"vulnerabilities": ["f2",1],
"happiness": ["good thing", 10] }

如果你有一个更复杂的json文件,我们可以使用awk命令:

for file in *.json; do
awk 'BEGIN { nopen = 0; nclose = 0; } { nopen += gsub(/{/, "{"); nclose += gsub(/}/, "}"); print; if(nopen > 0 && nclose == nopen) { exit; } }' $file > $file.new
done

在这里,我们计算开括号和闭括号的数量,如果{的数量等于}的数量,则结束。awk::gsub((函数允许我们计算一行中给定字符的出现次数。这个主unix命令甚至可以处理一些语法错误的json文件。由于您无法通过vi编辑器手动更正所有这些文件。

最新更新