Bash
如何以相同格式在兩個變數的列中顯示數據?
我編寫了以下程式碼以顯示按列格式化的數據:
str1='hello i am robert and your ma frnd' str2='thisisaverylongword thisistoohehehe andherefinishthe string hereis a other linefortheexample' IFS=$'\n' echo '----------------------' echo 'STRING SHORT' echo '----------------------' echo "$str1" | column -t echo echo '----------------------' echo 'STRING LONG' echo '----------------------' echo "$str2" | column -t
哪個輸出:
---------------------- STRING SHORT ---------------------- hello i am robert and your ma frnd ---------------------- STRING LONG ---------------------- thisisaverylongword thisistoohehehe andherefinishthe string hereis a other linefortheexample
好的,現在我正在嘗試用相同的模式格式化字元串,但沒有合併它們。
這是我正在尋找的結果:
---------------------- STRING SHORT ---------------------- hello i am robert and your ma frnd ---------------------- STRING LONG ---------------------- thisisaverylongword thisistoohehehe andherefinishthe string hereis a other linefortheexample
你有什麼想法嗎?可能是在格式化之前合併字元串並拆分它?
請注意,這只是一個範例,我正在尋找一個通用解決方案,而不僅僅是針對這種特定情況。
你不得不
printf "%s\n" "$str1" "$str2" | column -t
然後注入標頭
一般來說,我會寫一些像這樣使用數組的東西:
strings=( "$str1" "$str2" ... ) headers=( "STRING SHORT" "STRING LONG" ... ) exec 3< <( printf "%s\n" "${strings[@]}" | column -t ) for (( i=0; i<${#strings[@]}; i++)); do printf -- "----\n%s\n----\n" "${headers[i]}" n=$(wc -l <<< "${strings[i]}") for (( j=1; j<=n; j++ )); do IFS= read -r line <&3 echo "$line" done echo done exec 3<&-
筆記:
<( ... )
是一個 bash程序替換。這是一個作為文件名處理的普通管道。在您將使用管道但不能在子shell中執行管道右側的情況下,這非常方便。- 在這裡,我們打開文件描述符#3 來從這個“文件”中讀取數據:
exec 3<file
read -r line <&3
從程序替換中讀取一行數據exec 3<&-
關閉文件描述符- 在此處閱讀有關重定向的更多資訊:http ://www.gnu.org/software/bash/manual/bashref.html#Redirections
- 我本可以使用 a
printf ... | while read line; do ...; done
但我認為 for 循環會使計數更容易。