「ソースコードのタブ幅がエディタによって変わってしまい、レビューが読みにくい」
プログラムのソースコードや設定ファイルを扱っていると、「タブかスペースか」の違いに悩まされる場面があります。Pythonのように混在がエラーになる言語もあり、タブをスペースに揃えたい場面は意外と多いものです。
この記事では、ファイル内のタブをスペースに変換する
expandコマンド の実践的な使い方を解説します。タブ幅の指定、行頭だけの変換、逆変換を行う unexpand との使い分けまで、現場で使えるポイントをまとめました。・expand はファイル内のタブを指定した数のスペースに変換するコマンド
・-t でタブ幅、-i で行頭のタブだけを変換する指定が可能
・逆変換は unexpand、diff やコード整形の前処理で役に立つ
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜexpandコマンドが必要なのか?(タブとスペースの問題)
テキストエディタの設定によって、タブ文字の表示幅は4文字・8文字などと変わります。そのため、同じファイルでも開くエディタが違うとインデントが崩れて見えるという問題が起きます。さらにPythonのように、タブとスペースの混在をエラーとして扱う言語もあります。ソースコードやdiffで差分を取るとき、インデントがタブだったりスペースだったりするだけで、実際の変更点が埋もれてしまうこともあります。
expand コマンドは、ファイル内のタブ文字(\t)を指定した数のスペースに変換するコマンドです。元のファイルは書き換えず、標準出力に変換結果を出力するのが基本動作です。基本的な使い方
1. タブをデフォルト(8スペース)で変換する
オプションを付けずに実行すると、タブが8個のスペースに置き換えられます。# tab.txt の内容(タブ区切り) $ cat tab.txt 1 2 3 4 5 # タブを8スペースに変換して表示 $ expand tab.txt 1 2 3 4 5
tab.txt 自体は変更されません。2. タブ幅を指定する(-t)
-t オプションでタブ幅を数値で指定できます。4スペース幅にしたい場合は -t 4 と書きます。# タブを4スペースに変換 $ expand -t 4 tab.txt 1 2 3 4 5
-t 4、従来のUnix系設定ファイルは -t 8 が定番です。3. 結果をファイルに保存する
変換結果を別ファイルとして保存するには、リダイレクトを使います。# 変換結果を新しいファイルに保存 $ expand -t 4 tab.txt > tab_spaces.txt
sponge(moreutils)を使うか、一度別ファイルに出してから mv で上書きします。4. 行頭のタブだけを変換する(-i)
-i(initial)オプションを付けると、各行の先頭にあるタブだけを変換し、行の途中にあるタブはそのまま残します。# 行頭のタブだけを4スペースに変換 $ expand -i -t 4 source.py
応用・実務Tips
unexpandで逆変換する
スペースをタブに戻したい場合はunexpand コマンドを使います。# 行頭の連続スペースをタブに戻す(デフォルト動作) $ unexpand source.txt # タブ幅4で、すべてのスペースを対象に変換 $ unexpand -a -t 4 source.txt
-a(all)を付けると行の途中のスペースも対象になります。diffのノイズを消すための前処理
タブとスペースの違いで差分が大量に出てしまう場合、両方のファイルをexpand で正規化してから diff を取ると、本当の変更だけが見えるようになります。# 両方のファイルをスペース化してから比較 $ diff <(expand -t 4 old.py) <(expand -t 4 new.py)
トラブルシュート・エラー対処
「変換したはずなのにタブが残っている」場合
expand は標準出力に結果を出すだけで、元ファイルは書き換えません。ファイル自体を変換したい場合は、リダイレクトで別ファイルに保存し、mv で上書きしてください。# 一度別ファイルに保存してから上書き $ expand -t 4 tab.txt > tab.txt.new $ mv tab.txt.new tab.txt
「行頭以外のタブも変換されてしまう」場合
デフォルトでは行の途中のタブも変換対象です。行頭だけを揃えたい場合は、必ず-i オプションを付けてください。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| タブをデフォルト(8スペース)で変換する | expand ファイル名 |
| タブ幅4でスペースに変換する | expand -t 4 ファイル名 |
| 行頭のタブだけを変換する | expand -i -t 4 ファイル名 |
| 変換結果を別ファイルに保存する | expand -t 4 ファイル名 > 出力ファイル名 |
| スペースをタブに逆変換する | unexpand -a -t 4 ファイル名 |
| diffのノイズを消すための前処理 | diff <(expand -t 4 old) <(expand -t 4 new) |
テキスト整形の基本コマンドをきちんと押さえたい方へ
expand・unexpand はコード管理やファイル比較の現場で意外と頼れる基本ツールです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます