P J*_*nes 18 pipe sed text-processing streams
我正在为非技术观众准备一个演示文稿。我有一个在 bash 中运行的程序,它输出连续的值流,其中一些很重要。我想强调显示的重要结果,以便观众可以了解它们的频率。问题是我无法sed
对正在运行的流进行操作。如果我将结果放在一个文件中,它工作正常,如下所示:
cat output.txt | sed "s/some text/some text bolded/"
Run Code Online (Sandbox Code Playgroud)
但是如果我在运行输出上尝试同样的事情,就像这样:
command | sed "s/some text/some text bolded/"
Run Code Online (Sandbox Code Playgroud)
sed
什么也没做。有什么想法吗?
正如兰伯特所指出的那样,我所说的sed
无所作为是含糊的。正在发生的事情是程序输出到stdout
(我很确定它没有写入到stderr
),就像往常一样,即使它是通过管道传输的sed
。
问题似乎是该命令调用了第二个程序,然后该程序输出到 stdout。第一个程序打印了几行;这些我可以编辑。然后是第二个程序打印的值流;这些我无法编辑。
Perl 和 awk 方法也不起作用。
Gil*_*il' 13
很有可能命令的输出被缓冲了。当命令写入终端时,缓冲区会在每个换行符上刷新,因此您会看到它以预期的速度出现。当命令写入管道时,缓冲区仅在达到几千字节时才刷新,因此滞后很多。这就是标准输入/输出库的默认行为。
要强制命令不影响其输出,您可以使用unbuffer
(来自expect)或stdbuf
(来自GNU coreutils)。
unbuffer command | sed …
stdbuf -o0 command | sed …
Run Code Online (Sandbox Code Playgroud)