String 将printf与bash一起使用。打印字符串溢出列

String 将printf与bash一起使用。打印字符串溢出列,string,bash,String,Bash,我在用Bash。我使用printf“%-40s%s”$a$b在两列中显示两个字符串。第二个字符串很长,溢出并打印在第一列下一行的开头。如何使第二列中的字符串溢出到第二列中?您可以使用: printf "%40s\n%40s\n" "aaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbb" aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbb

我在用Bash。我使用
printf“%-40s%s”$a$b
在两列中显示两个字符串。第二个字符串很长,溢出并打印在第一列下一行的开头。如何使第二列中的字符串溢出到第二列中?

您可以使用:

printf "%40s\n%40s\n" "aaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbb"
             aaaaaaaaaaaaaaaaaaaaaaaaaaa
             bbbbbbbbbbbbbbbbbbbbbbbbbbb

-
之前的
40
用于左对齐。

这并不漂亮,我仍然觉得它可以更好(但我看不到任何明显的改进方法),但它对我有效(第一列的对齐方式不正确):

上列:

#!/bin/bash

a=$1
b=$2
w=${3:-$(tput cols)}


fmta=$(fold -w 40 <<<"$a")
lca=$(wc -l <<<"$fmta")

fmtb=$(fold -w $(( w - 40 )) <<<"$b")
lcb=$(wc -l <<<"$fmtb")

if [ "$lca" -lt "$lcb" ]; then
    fmta+=$(printf ' \n%.0s' $(seq 0 $(( lcb - lca ))))
fi

pr -t -2 <<<"$fmta"$'\n'"$fmtb"

$(tput cols)
不起作用时,为端子宽度接受第三个可选参数。可能可以使用
/col.sh“$a”“$b”“$COLUMNS”

它确实产生了类似的效果。我没有把问题说清楚。两列中有两个字符串。第一个字符串是左对齐的。第二个字符串位于第40列。第二个字符串很长,溢出到下一行。但它溢出到第一列,但没有溢出到第二列,这正是我想要的。我怎样才能做到这一点?您如何决定在哪里包装第二列?溢出似乎与窗口大小有关。如果窗口小于第二列中显示的字符串长度,则在执行printf命令时,它会溢出到下一行的开头,而不是第二列。我认为对此无能为力?我正在使用Cygwin终端。也许我需要预先设置窗口大小以防止它发生。它是可复制的使用格式字符串I gaveIs您的窗口70列宽?
tput cols
怎么说?字符串的结尾真的覆盖了同一行第一列的内容吗?另外,上面的三个示例行是三种不同的长度,在这里没有任何帮助。我没有把问题说清楚。两列中有两个字符串。第一个字符串是左对齐的。第二个字符串位于第40列。第二个字符串很长,溢出到下一行。但它溢出到第一列,但没有溢出到第二列,这正是我想要的。我怎样才能做到这一点呢?你能不能回显这两个字符串并粘贴它们的值。这样我就更容易理解了。溢出似乎与窗口大小有关。如果窗口小于第二列中显示的字符串长度,则在执行printf命令时,它会溢出到下一行的开头,而不是第二列。我认为对此无能为力?我正在使用Cygwin终端。也许我需要预先设置窗口大小以防止它发生。它可以使用我提供的格式字符串进行复制。对我来说很好。我将把它放在一个函数中。唯一的问题是,当原始shell脚本运行时,似乎没有任何方法来固定窗口大小,以便可以设置w变量(即,在没有tput的情况下)。@phil如果没有
tput
$COLUMNS
(来自终端/shell),我不确定如何获得窗口的宽度。您应该在会话中设置
$COLUMNS
,这样您就可以将其导出,并在调用
col.sh
的位置执行该操作(或者直接将其嵌入
col.sh
)。但除此之外(或者通过某种方式传递
$COLUMNS
),我不确定您还可以做什么。对不起,$COLUMNS作为第三个参数很好。我现在没事了。太棒了。
$ a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$ b=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
$ ./col.sh "$a" "$b"