我并不是要阻止 sed 进行块缓冲!我希望它甚至没有行缓冲区。
我不确定这是否可能。
基本上,从原始伪终端与它们交互时的行为sed
和行为之间存在很大差异:当它通过 STDIN 接收插入的字符时,会立即吐回插入的字符,而即使在原始模式下也不会。cat
cat
sed
可以进行一个思想实验:给定一个简单的 sed 命令,例如s/abc/zzz/g
,向 sed 发送输入流123ab
意味着sed
充其量可以提供超过标准输出的字符123
,因为它还不知道ac
是否会到达并导致结果string to be 123zzz
,而任何其他字符都会让它准确打印进来的内容(如果你愿意的话,允许它“赶上”)。所以在某种程度上很明显为什么cat
会立即响应;它负担得起。
所以当然这就是它在理想世界中sed
的工作方式,在这个世界中,作者实际上关心这种用例。
我怀疑情况并非如此。实际上,通过我不太详尽的方法,我看到sed
无论如何都会行缓冲(这使得它总是能够确定是否打印 3 z),除非你告诉它你关心匹配您的正则表达式过去/超过换行符,在这种情况下,它只会在提供任何输出之前缓冲整个该死的东西。
我理想的解决方案是找到一个sed
能够吐出它已经完成解析的所有文本,而无需等到行尾才这样做。在我上面的小例子中,它会立即吐出字符1
, 2
, 和3
, 而在输入a
and b
(输入)时,它什么也没说,直到c
看到 a (打印zzz
)或X
看到任何其他字符,在这种情况下abX
被打印,或者在 EOF 的情况下ab
被打印。
我是索尔吗?我应该只是用我想要的功能逐步实现我的 Perl 代码,还是有机会通过某种配置获得这种神奇的美味功能?
有关我为什么想要这个的更多详细信息,请参阅我的另一个问题。
因此,一个潜在的解决方法是手动建立输入组以在调用之间“拆分” sed
(或者在我的情况下,因为我已经在处理 Perl 脚本,perl 的正则表达式替换运算符),以便我可以手动执行冲洗。但这无法达到相同水平的响应能力,因为它需要我仔细考虑表达式来描述“缓冲”发生的点,而不是让正则表达式解析器自动完成。