5

我有一个问题。我的文本应该以指定的宽度右对齐。我已经设法将输出减少到所需的大小,但是我无法将所有东西都放在右侧

这是我得到的:

#!/usr/local/bin/bash

length=$1
file=$2
echo $1

echo -e "length = $length \t  file = $file "
f=`fold -w$length $file > output`
while read line
do
        echo "line is $line"
done < "output"

谢谢

4

3 回答 3

21

尝试:

printf "%40.40s\n" "$line"

这将使它与宽度 40 右对齐。如果您不想截断,请删除.40(感谢丹尼斯!):

printf "%40s\n" "$line"

例如:

printf "%5.5s\n" abc
printf "%5.5s\n" abcdefghij
printf "%5s\n" abc
printf "%5s\n" abcdefghij

将打印:

  abc
abcde
  abc
abcdefghij
于 2010-11-21T16:57:46.963 回答
1

你的最后一步可能是

sed -e :a -e 's/^.\{1,$length\}$/ &/;ta'
于 2010-11-21T16:58:13.453 回答
1

这是一个非常古老的问题(2010 年),但它是谷歌的最高结果,所以也可以。在这里现有的答案中,一个是不针对终端宽度进行调整的猜测,另一个调用 sed ,这不必要地昂贵。

printf 解决方案更好,因为它是内置的 bash,所以它不会减慢速度,但不是猜测 - bash 给你 $COLUMNS 告诉你你正在处理的终端窗口有多宽。

所以虽然你可以明确地对齐,比如第 40 列:

printf "%40s\n" "$the_weather"

您可以根据终端宽度调整它的大小:

printf "%$COLUMNSs\n" "$the_weather"

(因为我们在这里混合了语法,所以我们对 bash 变量使用了完整形式的语法,即 ${COLUMNS} 而不是 $COLUMNS,因此 bash 可以从其他语法中识别变量

在行动中.. 现在我们已经释放了所有 sed 处理时间,我们可以将它用于其他事情,也许:

the_weather="$(curl -sm2 'http://wttr.in/Dublin?format=%l:+%c+%f')"
printf "%${COLUMNS}s\n" "${the_weather:-I hope the weather is nice}"
于 2020-11-06T22:51:14.437 回答