複数の空行をsqueeze使用できることを知っています。cat -s
(そしてsqueeze all空の行を使用することもできますtr -s '\n'
。)しかし、どうするか疑問に思います。探すこの場合、入力ストリームから。
stream-of-input | grep -qz $'\n\n\n'
それでは大丈夫だと思いましたが、そうではありませんでした。
簡単なツールでこの種の検索を実行する方法はありますか?
つまり、3つの連続したバイトが改行の場合、入力を読み込み、ゼロ状態で終了します。 3つの連続した改行が見つからず、EOFに達すると、ゼロ以外の状態で終了します。
ベストアンサー1
tr
以下を使用して、ストリームを通常grepできるストリームに変換できます。
stream | tr 'x\n' '\0x' | grep -qz xxx
これはすべてのx
バイトをヌルバイトに変換し、すべての改行バイトをx
sに変換します。これはいつものようにgrep出力できます。つまり、linefeed -> x -> nullパスに沿って1段階移動するので、3つの改行文字シーケンスはx
3つのsシーケンスになり、x
他のバイトは表示されません(null終了行になりますgrep
)。
これは効果がありますPOSIXとともにtr
ですがgrep -z
拡張です。あなた可能必要ありません。ここでは別々の動作を必要とせず、ほとんどの銀grep
バイナリデータを処理します。POSIXはgrep
テキストファイルだけを処理するだけです。したがって、どのような方法でも拡張機能に依存します。
実際のデータがテキストファイルであるか、バイナリセーフアクションに依存しない場合は、おそらく生き残ることができます。
stream | tr 'x\n' '\nx' | grep -q xxx
- つまり、2バイトだけ交換すれば良いのです。これはほぼPOSIXと互換性がありますが、実際にはほとんどどこでも動作します(問題は最後の行です)。正しく終了しないため、テキストファイルではないため、grep
厳密に受け入れる必要はありません。)。
どちらの場合も、可能な問題の1つは、既存のバイトを持たないファイルが1つの非常に長い行で処理され、実装がx
処理できる制限を超える可能性があることです。grep
予想される他の共通バイトを選択すると、問題が解決される可能性があります。
元のコマンドが機能しないという事実に驚きましたが、grep -qz $'\n\n\n'
エラーがあります。ポジティブ私にとって問題は、次のように動作し、grep -qz ''
常に一致しているようです。なぜこれが必要なのかわかりません。