連続したスペースとprintf

ある個数分の連続したスペースを使用したければスペースをループで結合して使用するなどは行わない方がいい。printfを使用する方が簡潔に書ける。

$ count=30

$ sp=''
$ for i in `seq 1 $count`
> do
>   sp="$sp "
> done

$ echo "f${sp}t"
f                              t

上のコードは1行で書ける。

$ sp=`printf "%${count}s"`

$ echo "f${sp}t"
f                              t

連続したスペースとダブルクォーテーション

ちなみにスペースを含む変数は、ダブルクォーテーションで括らないと、echoしたときに連続するスペースが消されてしまう。

$ echo f${sp}t
f t

もしスペース始まりであれば、先行するスペースはすべて消える。

$ echo ${sp}t
t

連続したスペースとprintfの応用

printfは標準出力を整形して出力することが目的なので、sedと組み合わせて、テンプレートファイルのきれいな編集などにも使える。

たとえば、次のようなテンプレートファイルがあり、%TITLE%を置き換えたうえで、末尾の##を他の行と揃えたいとする。

######################################################################
## %TITLE%##
######################################################################

#が70文字分あり、文頭の'## 'と文末の'##'の5文字分以外をTITLEとスペースで埋めればいいので、printf %-65s "$title"となる。-65s-がついているのは左揃えにしたいから。printf %65s "$title"だと右揃えになってしまう。

$ title='text the length of which is not determined before command is executed.'
$ title=`echo $title | head -c $(($RANDOM % 50))`
$ sed -e "s/%TITLE%##/`printf %-65s \"$title\"`##/" template.txt
######################################################################
## text the length of whic                                          ##
######################################################################