タブとスペースを変換するのにsedを使う事があるのだが、ソースコードのインデントなんかだと幅がズレてしまったりしてあまり良くな買ったりする。 で、そういうときはexpandコマンドを使うと楽なので、一応使い方について残しておくことにする。

1. タブ→スペース変換

タブ→スペースに変換する場合は、expandコマンドを利用する。

blacknon@BS-PUB-UBUNTU-01:~$ # タブ付きで出力
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "\taaa\nxxx\tbbb"
        aaa
xxx     bbb
blacknon@BS-PUB-UBUNTU-01:~$ # cat -Aで見ると、タブ(^I)があるのが見える
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "\taaa\nxxx\tbbb"|cat -A
^Iaaa$
xxx^Ibbb$
blacknon@BS-PUB-UBUNTU-01:~$ # expandでタブをスペースに変換する
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "\taaa\nxxx\tbbb"|expand
        aaa
xxx     bbb
blacknon@BS-PUB-UBUNTU-01:~$ # cat -Aで見ると、タブがなくスペースに変換されていることがわかる
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "\taaa\nxxx\tbbb"|expand|cat -A
        aaa$
xxx     bbb$

なお、デフォルトではタブの文字数は8文字となっているため、もし違う文字数にしたい場合は-tオプションで変更するといいだろう。 -i オプションを付与すると、空白以外の文字の後ろにあるタブは対象外にしてくれる。

2. スペース→タブ変換

スペース→タブに変換する場合は、unexpandコマンドを利用する。

blacknon@BS-PUB-UBUNTU-01:~$ # スペース付きで出力
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "        aaa\nxxx     bbb"
        aaa
xxx     bbb
blacknon@BS-PUB-UBUNTU-01:~$ # タブに変換
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "        aaa\nxxx     bbb"|unexpand
        aaa
xxx     bbb
blacknon@BS-PUB-UBUNTU-01:~$ # cat -Aでみると、ちゃんとタブに変換されているのがわかる
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "        aaa\nxxx     bbb"|unexpand |cat -A
^Iaaa$
xxx     bbb$

まぁ、特定の行とか範囲だけを指定してやる場合になると、sedやらawkで処理中に呼び出して置換をすることになるかなと思うけど、そんな処理あまりやることは無いだろう。 多分。