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 ''常に一致しているようです。なぜこれが必要なのかわかりません。

答え2

lex(または)はこれを処理できます。たとえば、次は主に標準出力へのデフォルト出力を防ぐために追加の規則を使用してflexファイルに保存します。tresn.l

%%
\n\n\n  { exit(0); }
<<EOF>> { exit(1); }
\n\n    { ; }
\n      { ; }
.       { ; }
%%

暗黙のルールを使用してコンパイルおよびmake導入libfl*

$ CFLAGS=-lfl make tresn
lex  -o lex.tresn.c tresn.l
cc -lfl   -o tresn lex.tresn.c  -ll
rm -f lex.tresn.c
$ printf "\n\n" | ./tresn ; echo $?
1
$ printf "\n\n\n" | ./tresn ; echo $?
0

一部のシステムでは、ベンダーのコンパイルスペース外のシステムの下に特定のポートまたはパッケージを追加または非表示にする必要が-L/opt/local/libありCFLAGSます。LDFLAGSlibfl*

関連情報