附加到管道并传递?

附加到管道并传递?

我有一个简单的 bash 函数除以两个数字:

echo "750/12.5" | bc

我想从 中获取输出bc并将结果附加/24并通过管道传输到 的另一个实例bc

就像是:

echo "750/12.5" | bc | echo $1 + "/24" | bc

$1管道结果在哪里。

PS我意识到我可以做的echo "750/12.5/24" | bc问题更多是关于将文本附加到管道结果。

答案1

我使用sed并替换了行尾来实现此目的:

echo "my text" | sed 's/$/ more text/'

返回:

my text more text

你的例子:

echo "750/12.5" | bc | sed 's/$/\/24/' | bc

答案2

替代方法:

TL;DR:用于cat与 stdin ( -) 作为参数连接。请注意,它会用换行符分隔连接的流;如果不需要,请删除。

不幸的是,这种方法对于您的特定用例来说有点麻烦,因为bc如果该表达式中间有换行符,则会失败:

$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error

您可以通过从原始结果中删除换行符来解决此问题bc

$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2

然而,我通过谷歌搜索“bash附加到管道”发现了这个问题,就我而言,实际上我想要连接之间的换行符。因此,对于那些出于同样原因的人,请使用| cat - <(...)

$ echo foo | cat - <(echo bar)
foo
bar
$ echo foo | cat - <(echo bar) | sort | cat - <(echo last_line)
bar
foo
last_line
$ echo foo | cat - <(echo bar) | sort | cat <(echo header) - <(echo last_line)
header
bar
foo
last_line

答案3

在最简单的选项中,这确实附加到管道流:

$ echo "750/12.5" | { bc; echo "/24"; }
60
/24

然而,它有一个意外的换行符,为避免您需要使用 tr:

$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24

或者,考虑到命令扩展会删除尾随换行符:

$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24

但也许,正确的方法应该类似于:

$ echo "$(echo "750/12.5" | bc )/24"
60/24

如果要在 bc 中使用,可以写成这样:

$ bc <<<"$(bc <<<"750/12.5")/24"
2

其中,要获得合理的浮点数精度应该类似于:

$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000

请注意需要两个比例,因为有两个 bc 实例。

当然,一个 bc 实例只需要一个比例:

$ bc <<<"scale=5;750/12.5/24"

事实上,你应该考虑的是字符串:

$ a=$(echo "750/12.5")        # capture first string.
$ echo "$a/24" | bc           # extend the string
2

上面关于规模的评论在这里仍然有效。

答案4

您可以使用awk向管道插入/附加任何内容:

$ date | awk 'BEGIN{print "prefix line"} {print}  END{print "suffix  line"}'
prefix line
Mo 21. Aug 15:24:30 CEST 2023
suffix  line

在哪里

  • date- 是您的输入管道(例如此处的当前日期)
  • BEGIN{print "prefix line"}- 该块将在 main 之前插入输出
  • {print}- 打印输入管道的内容;如果需要的话可以在这里做一些处理
  • END{print "suffix line"} - 这会在 main 之后附加输出

要在单行中执行相同的操作,只需使用printf

$ date | awk 'BEGIN{printf("prefix line >> ")} {printf($0)}  END{printf(" << suffix  line")}'
prefix line >> Mo 21. Aug 15:32:08 CEST 2023 << suffix  line/upload/sc505enb/tmp>

$ echo "750/12.5" | bc | awk '{printf($0)}  END{printf("/24\n")}'
60/24

相关内容