我有一个问题。 我的文本应该在指定的宽度右对齐。我已设法将输出切换到所需的大小,但我把所有东西放在右侧都有问题
这是我得到的:
#!/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"
感谢
答案 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}"