换行时,对齐换行"列"输出中的文本


docs=(
"    cmd1||Run cmd1."
"    cmd3||Long text Long text Long text Long text Long text Long text."
$'    cmd2|[N]|Do something with N.nA new line.nAnother line'
)
column -t 
--separator "|" 
--output-width 60 
--table-noheadings 
--table-wrap C3 
--table-columns C1,C2,C3 < <(printf "%sn" "${docs[@]}")
#     cmd1               Run cmd1.
#     cmd3               Long text Long text Long text Long text L
#                        ong text Long text.
#     cmd2          [N]  Do something with N.
# A new line.
# Another line
# Expected:
#     cmd1               Run cmd1.
#     cmd3               Long text Long text Long text Long text L
#                        ong text Long text.
#     cmd2          [N]  Do something with N.
#                        A new line.
#                        Another line

为了清晰起见,我想在每个单元格中保留换行符,但似乎没有用于此目的的标志(对于上下文,第3列是从函数注释等中提取的,所以我不希望每一行都混在一起(。是否有一种稳健的方法将每个单元格的内容与预期输出对齐?作为一种变通方法,我曾想过以某种方式计算C1和C2的宽度,并用sed为空格做准备,但感觉很麻烦,我不知道该怎么做。

EDIT:每次都会动态生成docs数组和每个文档的内容。

util linux 2.36.2中的

经过思考,最简单、最稳健的解决方案似乎只是用换行符拆分最后一列的内容,并用空单元格构建新行:

docs=(
"    cmd1||Run cmd1."
"    cmd3||Long text Long text Long text Long text Long text Long text."
$'    cmd2|[N]|Do something with N.'
$'    ||A very very very very very very very very long line.'
$'    ||Another line'
)
column -t 
--separator "|" 
--output-width 60 
--table-noheadings 
--table-wrap C3 
--table-columns C1,C2,C3 < <(printf "%sn" "${docs[@]}")
# cmd1       Run cmd1.
# cmd3       Long text Long text Long text Long text Long 
#            text Long text.
# cmd2  [N]  Do something with N.
#            A very very very very very very very very lon
#            g line.
#            Another line

最新更新