如何使用 sed 来操作连续流输出?

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)

  • `sed` 本身使用这样的缓冲区,(参见 ChennyStar 帖子),因此这里的示例可能不起作用,因为 `sed` 是取消缓冲的 `command`:`cat /etc/passwd | unbuffer sed` 但 `sed` 本身有一个 `-u` 选项,因此 `grep` 可能更适合此示例。非常感谢您提供的背景信息!很好的答案! (2认同)

Che*_*tar 9

sed 有一个选项:

-u, --unbuffered

它从输入文件加载最少量的数据并更频繁地刷新输出缓冲区。有关man sed更多详细信息,请参阅。