Bash 有没有办法区分脚本中的多行输出?

Bash 有没有办法区分脚本中的多行输出?,bash,perl,unix,sed,pipeline,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

我正在运行一个脚本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版本仅在所有输出完成一个kangaroo总数后插入一个kangaroo,而不是每个输出一个kangaroo

我尝试过其他的变体,但总是一个或另一个-每一行后面都有一只袋鼠,或者每一行后面都有一只袋鼠。我尝试使用tr用表单提要替换新行,但没有任何区别

如何做到这一点


顺便说一句,我已经仔细阅读了它的答案,但他们正在讨论一个文件的操作。我无法将此处描述的原则应用于管道并读取标准DIN。

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

无法区分

echo -e 'first\nsecond'
echo -e 'first\nsecond'
echo -e 'first\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

您可以控制脚本的执行吗?换句话说,您是否可以控制执行input.sh的脚本?你能在脚本执行过程中修改它吗?是的,但事实上,我正在操作许多内容不可预测的脚本。sh是一个代表许多bash、python或ruby脚本的替代程序。您到底想对这个输出做些什么?与其抽象问题并要求一个非常狭隘的理想,为什么不发布您的实际输入和期望的输出?我试图区分单个输出和脚本,就这么简单。我想对他们做一些与问题完全无关的事情。我看不出告诉您我希望对这些多行输出应用什么转换会有什么帮助,因为它独立于上述问题。当我想到您可能要做的事情时,首先想到的是:测量脚本中命令的响应时间。这是你更高层次的目标吗?我的意思是这是有道理的,但我非常想相信这不是真的。真的没有办法通过管道对单个多行序列进行操作吗?这似乎是一件非常有用的事情。可以通过管道而不仅仅是单独的行来放置段落有无数的用途……如果最后看到的输出不是永恒循环中的kangaroo,那么可以在每个外部命令之后插入一个管道来添加kangaroo。不可靠,但可能相当准确。非常抱歉,我真的不明白你的意思。你能澄清一下这个建议吗?按原样,听起来每隔一行都是kangaroo。就像tail-f一样,只有当您从文件句柄中画出一个空格时,才打印kangaroo,然后再次轮询,直到收到新的输入。当read返回零字节时,表示缓冲区已用完。看看tail的来源。问题是,并非所有的输出都来自echo……我正在运行运行其他进程的脚本,因此输出有时来自echo,通常是二进制的输出。在这种情况下,@tripleee Look for chunk of output可能会有所帮助。也许改变你的需求更容易:有没有其他方法可以找到你想要的?查找所有多行输出,并查看最后一行sed's/*second.*/&kangeroo/',您是否总是有两行输出,或者您是否可以在二进制文件周围编写一个包装器,也就是mv my_prog my_prog.org,并在脚本my_prog中调用my_prog.org$@以完成后也会添加一个kangeroo?
first
 secondkangeroo
first
 secondkangeroo
first
 secondkangeroo
==================kangeroo
first
 second
 firstkangeroo
second
 first
 secondkangeroo