如何阻止sed缓冲?

Use*_*er1 8 linux bash grep sed

我有一个写入fd3的程序,我想用grep和sed处理这些数据.以下是代码到目前为止的样子:


exec 3> >(grep "good:"|sed -u "s/.*:\(.*\)/I got: \1/")
echo "bad:data1">&3
echo "good:data2">&3
Run Code Online (Sandbox Code Playgroud)

在我做之前没有输出

exec 3>&-

然后,我想要的一切终于如我所料:

I got: data2

如果我只使用grep或者只使用sed,它似乎立即回复,但混合它们似乎会导致某种缓冲.如何从fd3立即获得输出?

Jon*_*han 11

您只需告诉 grep 和 sed 不要缓冲行:

grep --line-buffered 
Run Code Online (Sandbox Code Playgroud)

sed -u
Run Code Online (Sandbox Code Playgroud)


Use*_*er1 10

我想我找到了.出于某种原因,grep不会自动进行行缓冲.我添加了一个--line-buffered选项grep,现在它立即响应.

  • 哇.我很抱歉你的OSX机器.更为遗憾的是,OSX实际上要花钱.更少的功能,更多的钱,Apple如何实现这一目标? (3认同)

tch*_*ist 6

停止缓冲的另一种方法是通过s2p sed-to-Perl 转换器运行sed它,并插入一个指令以对其进行命令缓冲,也许像

\n\n
BEGIN { $| = 1 }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样做的另一个原因是,它为您提供了更方便的 ERE 表示法,而不是讨厌的反斜杠遗留 BRE。您还可以获得完整的 Unicode 属性,这通常是至关重要的。

\n\n

但你不需要\xe2\x80\x99这样一个简单的sed命令的翻译器。并且您也不需要同时使用grepsed。这些都有效:

\n\n
perl -nle \'BEGIN{$|=1} if (/good:/) { s/.*:(.*)/I got: $1/; print }\'\n\nperl -nle \'BEGIN{$|=1} next unless /good:/; s/.*:(.*)/I got: $1/; print\'\n\nperl -nle \'BEGIN{$|=1} next unless /good:/; s/.*:/I got: /; print\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在您还可以访问最小量词 , *?, +?, ??,{N,}?{N,M}?。这些现在允许诸如.*?or\\S+?或 之类的东西[\\p{Pd}.]??,这可能是更可取的。

\n