\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에서는 이를 허용하는 것 같습니다 .)

-z한 줄이 아닌 전체 파일을 일치시키는 경우 Busybox의 grep에는 개행 대신 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

이는 전체 입력 개체를 재귀적으로 순회하여 발견된 첫 번째 빈 개체에서 0이 아닌 종료 상태로 중지됩니다. "null 개체"는 키가 없는 개체입니다.

예:

$ 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()대신 and를 사용합니다...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 '{}'

관련 정보