Bash:在同一列内包裹长行

我想创建一个包含两列的表.第一列包含键名,第二列包含值.该值可以是通常在终端中产生多行的文本.

使用printf或column,我可以轻松获得以下输出:

<----- Terminal Length ------>
key1     This is the value for
key1 with a very long text. 
...

但是我想将值显示在同一列中,如下所示:

<----- Terminal Length ------>
key1     This is the value for
         key1 with a very long
         text.
...

如何在同一列中包含长行?

最佳答案 基于andlrc评论的解决方案:

columnize2 () { 
    indent=$1; 
    collen=$(($(tput cols)-indent)); 
    keyname="$2"; 
    value=$3; 
    while [ -n "$value" ] ; do 
        printf "%-10s %-${indent}s\n" "$keyname" "${value:0:$collen}";  
        keyname="";
        value=${value:$collen}; 
    done
}

longvalue=---------------------------------------------------------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
columnize2 30 key1 $longvalue
key1       --------------------------------------------------
           -------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz

tput cols返回终端窗口中每行的字符数.我们使用它来确定每行可以打印的值的字符数(collen).如果它不适合一行,则其余行打印在以下行上.
print语句中的%-10s用于分配10个字符以显示键名(长键处理不好).
% – ${indent} s用于通过#indent字符缩进值.
仅打印适合一行的值的多个字符:${value:0:$collen}并从值值中删除已打印的字符= ${value:$collen}
对于以下行,我们不打印键名(通过将其设置为空字符串).

点赞