我想创建一个包含两列的表.第一列包含键名,第二列包含值.该值可以是通常在终端中产生多行的文本.
使用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}
对于以下行,我们不打印键名(通过将其设置为空字符串).