タブは一定数の可視空白ではなく、次のタブストップまでの移動を保存します。表示幅は現在の列とタブストップ設定によって変わります。expand と unexpand はその位置を考慮してタブ文字と空白を相互変換します。
テキスト操作 · レッスン 10
展開と折りたたみ
タブストップを基準に、expand と unexpand でタブと空白を相互変換する方法を学びます。
タブを空白へ変換する
expand は入力を読み、各タブを適切なタブストップまでに必要な空白へ置き換え、結果を stdout へ書きます。
$ expand sample.txt
標準ではタブストップは 8 列ごとです。1 列目のタブと 6 列目のタブでは展開が異なり、常に 8 個の空白へ置換されるわけではありません。
標準設定の expand はタブ文字をどのように置き換えますか?
タブストップを選ぶ
-t NUMBER で、指定列数ごとにタブストップを置きます。
$ expand -t 4 sample.txt
GNU expand は明示的なタブ位置をカンマ区切りで指定することもできます。各行で最初の非空白文字より前のタブだけを変換するには -i を使います。
4 列ごとのタブストップでタブを変換するコマンドはどれですか?
変換結果を安全に保存する
expand は入力ファイルを直接編集しません。保存するときは stdout を別のパスへリダイレクトします。
$ expand sample.txt > result.txt
expand sample.txt > sample.txt は使わないでください。シェルが expand の読み取り前に出力先を切り詰めるため、元データが失われます。別に書いた結果を検証してから、適切なファイル操作で元を置き換えます。
sample.txt を読み取る前に切り詰めず、展開したテキストを保存するコマンドはどれですか?
空白をタブへ変換する
unexpand は、選択したタブストップでの配置を保ちながら、変換可能な空白をタブへ置き換えます。GNU unexpand は標準では各行の最初の非空白文字より前だけを変換します。
$ unexpand result.txt
$ unexpand -a result.txt
-a は行全体の適切な空白を対象にします。8 個の空白を機械的に置き換えるのではなく、expand と同様に列位置とタブストップに依存します。異なる規則なら -t 4 などを指定します。
-a がない場合、GNU unexpand は通常どの空白を変換対象にしますか?
最初の非空白文字より後ろの空白も対象にする GNU unexpand のオプションはどれですか?
どちらのコマンドもファイル名がなければ stdin を読むため、パイプラインで使えます。表示上の配置が同じでも、空白へ変換して戻した結果が元のタブと空白の選択を完全には再現しないことがあります。
レッスン完了
展開と折りたたみ を完了しました
タブストップでの配置を保ちながら、タブと空白を変換できるようになりました。
タブを次の設定済みストップまで展開する。
-tで独自のタブストップを設定する。入力を置き換える前に別ファイルへ保存する。
unexpandの標準動作で行頭の空白を変換する。行全体の空白を対象にする場合は
-aを使う。