expandコマンドでタブをスペースに変換する方法|桁揃えやunexpandとの使い分けもコマンド


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドA-E, テキスト処理コマンド > expandコマンドでタブをスペースに変換する方法|桁揃えやunexpandとの使い分けもコマンド
「インデントにタブとスペースが混在していて、diffを取ると差分だらけになる」
「ソースコードのタブ幅がエディタによって変わってしまい、レビューが読みにくい」

プログラムのソースコードや設定ファイルを扱っていると、「タブかスペースか」の違いに悩まされる場面があります。Pythonのように混在がエラーになる言語もあり、タブをスペースに揃えたい場面は意外と多いものです。

この記事では、ファイル内のタブをスペースに変換する expandコマンド の実践的な使い方を解説します。タブ幅の指定、行頭だけの変換、逆変換を行う unexpand との使い分けまで、現場で使えるポイントをまとめました。
【この記事でわかること】
・expand はファイル内のタブを指定した数のスペースに変換するコマンド
・-t でタブ幅、-i で行頭のタブだけを変換する指定が可能
・逆変換は unexpand、diff やコード整形の前処理で役に立つ

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ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

Python系のコードを扱うときは -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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。