如何使用 busybox 检查整个文件的内容是否符合模式\s*{\s*}\s*
?您需要从头到尾检查整个文件,而不是像以前那样检查单个行grep
。
需要检测文件是否包含空 JSON 对象,例如在一般情况下:
{
}
以下是不符合模板要求的文件内容示例。
{
"field": {}
}
{}
{
}
答案1
如何使用 busybox 检查整个文件的内容是否符合模式
\s*{\s*}\s*
?
从字面上回答这个问题,而不考虑一般处理 JSON 文件的周围问题......
我想知道的第一件事是 Busybox 是否有任何支持 Perl 正则表达式的东西。但无论如何,即使\s
不能使用,POSIX RE 的等价物\s
是[[:space:]]*
。 (尽管 Busybox 似乎也接受\s
,至少在我的 Linux 上是这样。)
至于匹配整个文件而不是单行,Busybox 的 grep 可能可以选择-z
使用 NUL 而不是换行符作为“行”终止符。这取决于CONFIG_EXTRA_COMPAT
编译时选项,我的 Ubuntu 22.04 似乎设置了该选项,但是 YMMV。由于您的文本文件不应包含任何 NUL,因此应该与整个文件匹配。
我还假设,当您说“从头到尾检查整个文件”时,您的意思是模式应该锁定到文件的开头和结尾,并且不足以在文件的中间。正则表达式引擎通常在任何地方查找匹配项,并且您需要显式使用^
/$
锚点来锁定开头/结尾的模式。
所以:
$ printf ' \t \n { \n\t \n } \n \n\n' > test1
$ cat test1
{
}
$ busybox grep -qz '^[[:space:]]*{[[:space:]]*}[[:space:]]*$' test1 && echo match
match
答案2
注意:这个答案并不限于仅使用 Busybox 多二进制文件中内置的实用程序,而是使用实用jq
程序。这个众所周知的 JSON 处理工具可作为大多数常见架构的静态二进制文件使用,无需升级安装或使用权限。您还可以通过公共 Docker 映像使用它。
安装后jq
,您可以使用以下命令来确定 JSON 文档中是否有任何空对象:
jq '.. | select(type == "object" and (keys | length == 0) and halt_error)' file.json
这会递归遍历整个输入对象,并在找到的第一个空对象处以非零退出状态停止。 “空对象”是没有键的对象。
例子:
$ cat file1
{"hello":{"string":"{}"}}
$ cat file1 | if jq '.. | select(type == "object" and (keys | length == 0) and halt_error)' 2>/dev/null; then echo 'contains no empty object(s)'; else echo 'contains empty object(s)'; fi
contains no empty object(s)
$ cat file2
{"hello":{"not a string":{}}}
$ cat file2 | if jq '.. | select(type == "object" and (keys | length == 0) and halt_error)' 2>/dev/null; then echo 'contains no empty object(s)'; else echo 'contains empty object(s)'; fi
contains empty object(s)
上述jq
表达式的替代方案如下,它将相同的逻辑计算应用于输入文档的每个部分,但使用和walk()
代替:..
select()
walk(type == "object" and (keys | length == 0) and halt_error)
要获取输入中包含空对象的特定路径,您可以paths()
像这样使用:
paths(type == "object" and (keys | length == 0))
对于上面的第二个示例输入,这将返回以下路径数组:
[
"hello",
"not a string"
]
请注意,如果存在顶级空对象,则不会返回任何内容,但您可以将其与本答案开头的表达式结合起来以识别这些对象。
答案3
可能:
if
expr "@$(cat <file.json)" : '@[[:space:]]*{[[:space:]]*}[[:space:]]*$' > /dev/null
then
echo is an empty JSON object
fi
答案4
您需要删除所有换行符和空格,然后检查字符串是否与模式匹配。
{ tr -d '[:space:]' < file; printf '\n'; } | grep -Fxc '{}'