有什么方法可以区分脚本中的多个多行输出吗?

Is there any way to tell apart multiple multi-line outputs from a script?

我是运行一个脚本input.sh,它有多个多行输出,如下所示:

echo -e 'first \n second'
echo -e 'first \n second'
echo -e 'first \n second'

我无法控制这个文件,我只知道它会有多个多行输出。

我需要能够在该文件输出消息时实时对该文件的每个单独输出进行操作。缓冲是一个问题,但不是我在这里要问的问题。

我稍微简化了一点,但我的问题归结为:我想在每个单独输出的末尾插入一只袋鼠。在下面查看我的尝试:

./input.sh | sed 's/$/kangaroo/'

上面的这个版本在每个换行符之后插入一个袋鼠,而不是每个多行输出。

./input.sh | perl -0777 -pe 's/$/kangaroo/'

此 perl 版本仅在所有输出完成后插入一只袋鼠(总共一只袋鼠,而不是每次输出一只袋鼠。)

我尝试过其他变体,但它总是一个或另一个——每行换行后有一只袋鼠,或者每行后有一只袋鼠。我尝试使用 tr 将新行替换为换页,但这没有任何区别。

如何做到这一点?

顺便说一句,我仔细阅读了this question及其答案,但他们正在讨论对文件进行操作。我无法将那里描述的原则应用到管道和从标准输入中读取。

否;在一般情况下,没有办法可靠地判断两个字节是单独输出并一起缓冲,还是一起输出。

没法区分

echo -e 'first\nsecond'
echo -e 'first\nsecond'
echo -e 'first\nsecond'

来自

echo -e 'first\nsecond\nfirst'
echo -e 'second\nfirst\nsecond'

两者都输出以下字节流(以十六进制表示):

66 69 72 73 74 0A 73 65 63 6F 6E 64 0A 66 69 72 73 74 0A 73 65 63 6F 6E 64 0A 66 69 72 73 74 0A 73 65 63 6F 6E 64 0A

该流不包含有关这些字节的含义或它们是如何组合的任何信息。充其量,可能存在时间差异。

你需要一个技巧。

您可以尝试用您自己的包装器否决 echo 命令!

echo() {
   printf "%skangeroo\n" "$(/bin/echo $@)"
}

echo -e 'first \n second'
echo -e 'first \n second'
echo -e 'first \n second'
echo "=================="
echo -e 'first \n second \n first'
echo -e 'second \n first \n second'

结果:

first
 secondkangeroo
first
 secondkangeroo
first
 secondkangeroo
==================kangeroo
first
 second
 firstkangeroo
second
 first
 secondkangeroo