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 '{}'