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
,现在它立即响应.
停止缓冲的另一种方法是通过s2p sed-to-Perl 转换器运行sed
它,并插入一个指令以对其进行命令缓冲,也许像
BEGIN { $| = 1 }\n
Run Code Online (Sandbox Code Playgroud)\n\n这样做的另一个原因是,它为您提供了更方便的 ERE 表示法,而不是讨厌的反斜杠遗留 BRE。您还可以获得完整的 Unicode 属性,这通常是至关重要的。
\n\n但你不需要\xe2\x80\x99这样一个简单的sed
命令的翻译器。并且您也不需要同时使用grep
和sed
。这些都有效:
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}.]??
,这可能是更可取的。
归档时间: |
|
查看次数: |
7396 次 |
最近记录: |