gpt4 book ai didi

perl - 使 sed 不按行缓冲

转载 作者:行者123 更新时间:2023-12-02 00:59:26 28 4
gpt4 key购买 nike

我并不是试图阻止 sed 进行 block 缓冲!我希望它甚至不是行缓冲区。

我不确定这是否可能。

基本上,当从原始伪终端与 sedcat 进行交互时,它们的行为之间存在很大差异:cat > 当通过 STDIN 接收到插入的字符时,会立即吐出插入的字符,而 sed 即使在原始模式下也不会。

可以进行一个思想实验:给定一个简单的 sed 命令,例如 s/abc/zzz/g,将输入流发送到 sed,如 123ab 意味着sed 最多可以通过标准输出提供字符123,因为它还不知道是否c 将到达并导致结果字符串为 123zzz,而任何其他字符都会让它准确打印进来的内容(允许它“ catch ”,如果你愿意的话) 。因此,从某种程度上来说,为什么 cat 会立即响应就很明显了;它负担得起。

当然,这就是它在理想世界中的工作方式,其中 sed 的作者实际上关心这种用例。

我怀疑情况并非如此。实际上,通过我不太详尽的方法,我发现 sed 无论如何都会进行行缓冲(这使得它始终能够确定是否打印 3 z),除非你告诉它你关心匹配你的正则表达式过去/换行符,在这种情况下,它只会在提供任何输出之前缓冲整个该死的东西。

我理想的解决方案是找到一个sed,它将吐出所有它已经完成解析的文本,而无需等到行尾才这样做。在上面的小例子中,它会立即吐出字符 123,而 a > 和 b 正在输入(键入),它什么也没说,直到看到 c (打印 zzz)或任何其他字符看到 X,在这种情况下打印 abX,或者在 EOF 的情况下打印 ab

我是SOL吗?我应该用我想要的功能逐步实现我的 Perl 代码,还是仍然有机会通过某种配置来获得这种神奇美味的功能?

参见another question of mine了解更多关于我为什么想要这个的细节。

因此,一个潜在的解决方法是手动建立输入组,以便在对 sed 的调用之间“拆分”(或者在我的情况下,因为我已经在处理 Perl 脚本,perl 的正则表达式替换运算符(operator)),这样我就可以手动进行冲洗。但这无法达到相同水平的响应能力,因为它需要我仔细考虑表达式来描述“缓冲”发生的点,而不是让正则表达式解析器自动执行此操作。

最佳答案

有一个工具可以并行地将输入流与多个正则表达式进行匹配,并在决定匹配后立即采取行动。这不是 sed。是莱克斯。或者 GNU 版本,flex。

为了使这个演示工作,我必须定义一个 YY_INPUT 宏,因为 flex 默认情况下是行缓冲输入。即使在 stdio 级别没有缓冲,甚至在“交互”模式下,也假设您不希望一次处理少于一行。

所以这可能无法移植到其他版本的 lex。

%{
#include <stdio.h>

#define YY_INPUT(buf,result,max_size) \
{ \
int c = getchar(); \
result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
}
%}

%%

abc fputs("zzz", stdout); fflush(stdout);
. fputs(yytext, stdout); fflush(stdout);

%%

int main(void)
{
setbuf(stdin, 0);
yylex();
}

用法:将该程序放入名为 abczzz.l 的文件中并运行

flex --always-interactive -o abczzz.c abczzz.l
cc abczzz.c -ll -o abczzz
for ch in a b c 1 2 3 ; do echo -n $ch ; sleep 1 ; done | ./abczzz ; echo

关于perl - 使 sed 不按行缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com