\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ではこれを許可しているようです。)

-z1行ではなくファイル全体を一致させる場合、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

これは、入力オブジェクト全体を再帰的に巡回して見つかった最初の空のオブジェクトでゼロ以外の終了状態に停止します。 「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))

上記の2番目の入力例では、次のパス配列が返されます。

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

関連情報