附加到管道並傳遞?

附加到管道並傳遞?

我有一個簡單的 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

相關內容