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

时间:2019-06-03 02:57:28

标签: bash perl unix sed pipeline

我正在运行一个脚本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及其答案,但是他们正在讨论对文件的操作。我无法将此处描述的原理应用于管道并从stdin中读取。

3 个答案:

答案 0 :(得分:5)

无法区分

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

该流不包含有关这些字节的含义或如何组装的任何信息。充其量可能会有时间上的差异。

答案 1 :(得分:3)

否;在通常情况下,无法可靠地判断两个字节是分开输出还是一起缓冲,还是一起输出。

答案 2 :(得分:2)

您需要一个技巧。

您可以尝试使用自己的包装器来取代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