正确的文字对齐 - bash

时间:2010-11-21 16:51:22

标签: bash shell alignment text-alignment fold

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

这是我得到的:

#!/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"

感谢

3 个答案:

答案 0 :(得分:17)

尝试:

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

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

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

答案 1 :(得分:1)

你的最后一步可能是

sed -e :a -e 's/^.\{1,$length\}$/ &/;ta'

答案 2 :(得分:0)

这是一个非常老的问题(2010年),但它是Google排名最高的结果,所以它也是。在这里现有的答案中,一个是无法根据终端宽度调整的猜测,另一个是调用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}"