2010-11-21 25 views
3

私には1つの問題があります。 テキストは、指定された幅で右揃えにする必要があります。私は希望のサイズに出力をカットするために管理している、しかし、私は右側ここ右揃え - bash

上のすべてを置くことに問題がある、私が得たものである:

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

おかげ

答えて

16

試してみてください。

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 
+0

これは私にいくつかの奇妙な出力を与える可能性があり、なぜ – cubrilo

+0

を知りません:)私は出力が何だったかを推測できると思いますか?別のコメントに問題を投稿してください。長すぎる場合は、質問を編集して投稿してください。 –

+0

@cubrilo: '\ n'改行が必要な場合がありますので、出力は元の意味に似ています:' printf "%40.40s \ n" "$ line" '。 '.40'は、出力が長ければ切り捨てられますが、それはあなたが望むかもしれないが、そうでなければその部分を省略することができることに注意してください。 –

1

あなたの最後のステップは

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

私はこれを入れたときに:f = 'fold -w $ lenght $ file> output' do sed -e:a -e 's/^。\ {1、$ length \} $/&lt;echo "sed後、行は$ line" done <"test" エラー:sed:1: "s/^。\ {1、$ length \} $ /&/; "sed -e:a -e" s/^。\ {1、":REエラー:無効な反復カウントsed後、行は最後の行です – cubrilo

+0

@cubrilo:一重引用符を二重引用符に変更します。 $ length \} $ /&/; ta "'しかし、文字列が十分に長くなるまでループするので、この方法は遅いです。 –