如何根据模式 \s*{\s*}\s* 检查整个文件的内容?

如何根据模式 \s*{\s*}\s* 检查整个文件的内容?

如何使用 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 '{}'

相关内容