sed のブロックバッファリングを防ごうとしているわけではありません! 私はそれをラインバッファでさえないものにしたいと思っています。
これがまったく可能かどうかはわかりません。
sed
基本的に の動作とcat
生の疑似端末から対話するときの動作には大きな違いがありますcat
。挿入された文字を STDIN 経由で受信すると、挿入された文字をすぐに吐き出しますsed
が、生のモードでもそうではありません。
思考実験を実行することができます: のような単純な sed コマンドが与えられた場合s/abc/zzz/g
、 sed のような入力ストリームを sed に送信することは、せいぜい標準出力を介して文字を提供できることを意味123ab
します。文字列は になりますが、他の文字は入ってきたものを正確に出力します(必要に応じて「追いつく」ことができます)。したがって、ある意味で、なぜすぐに応答するのかは明らかです。する余裕があります。sed
123
c
123zzz
cat
もちろん、sed
の作成者が実際にこの種のユース ケースを気にかけている理想的な世界では、このように機能します。
そうではないのではないかと思います。実際には、それほど網羅的ではない方法sed
を使用して、一致を気にすることを伝えない限り、それが何であっても行バッファーになることがわかります (これにより、3 つの z を印刷するかどうかを常に判断できます)。あなたの正規表現は改行を過ぎたり超えたりします。その場合、出力を提供する前に、いまいましいもの全体をバッファリングするだけです。
私の理想的な解決策は、行末まで待たずに、解析が完了したすべてsed
のテキストを吐き出すa を見つけることです。上記の私の小さな例では、 、 、 、 、 、 、、およびが入力されている(入力されている) ときに、文字が即座に吐き出されます。が出力されるか、EOF の場合は出力されます。1
2
3
a
b
c
zzz
X
abX
ab
私はSOLですか?必要な機能を備えた Perl コードを段階的に実装する必要がありますか、それとも、この種の魔法のようにおいしい機能を何らかの構成で取得できる可能性はまだありますか?
なぜこれが必要なのかについての詳細は、私の別の質問を参照してください。
したがって、これに関する1つの潜在的な回避策は、呼び出し全体で「分割」する入力のグループを手動で確立することですsed
(または、私の場合、私はすでにPerlスクリプト、perlの正規表現置換演算子を扱っているため)、手動でソートできるようにしますフラッシング。しかし、正規表現パーサーに自動的に実行させるのではなく、「バッファリング」が発生するポイントを記述するために式を熟考する必要があるため、これは同じレベルの応答性を達成することはできません。