3つの連続した改行文字を検索しますか?

3つの連続した改行文字を検索しますか?

複数の空行を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バイトをヌルバイトに変換し、すべての改行バイトをxsに変換します。これはいつものようにgrep出力できます。つまり、linefeed -> x -> nullパスに沿って1段階移動するので、3つの改行文字シーケンスはx3つの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 ''常に一致しているようです。なぜこれが必要なのかわかりません。

おすすめ記事