tr / col / expand
| 対応: | 全Linux | |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) |
『tr』は文字の変換・削除・圧縮を1文字単位で行うコマンドです。『expand』はタブをスペースに、『unexpand』はスペースをタブに変換します。改行コードの変換や大文字小文字の変換など、文字レベルの整形によく使います。
構文
tr [オプション] 文字集合1 [文字集合2] expand [オプション] [ファイル...] unexpand [オプション] [ファイル...]
オプション一覧
| コマンド / オプション | 概要 |
|---|---|
| tr 'abc' 'ABC' | 文字集合1の各文字を文字集合2の対応する文字に変換します。 |
| tr '[:lower:]' '[:upper:]' | 小文字をすべて大文字に変換します。 |
| tr '[:upper:]' '[:lower:]' | 大文字をすべて小文字に変換します。 |
| tr -d '文字集合' | 指定した文字を削除します。 |
| tr -s '文字集合' | 連続する同じ文字を1文字に圧縮します。 |
| tr -c '文字集合1' '文字集合2' | 文字集合1の補集合(含まれない文字)を文字集合2に変換します。 |
| tr '\r' '\n' | Windows の改行コード(\r\n)の \r を削除するために使います。 |
| expand ファイル | タブをスペース8個に変換します。 |
| expand -t N ファイル | タブをスペースN個に変換します。 |
| unexpand ファイル | 先頭のスペースをタブに変換します。 |
サンプルコード
以下の例で各コマンドの動作を説明します。
sample_tr_col_expand.sh
# 処理対象のテキスト例: # "hello world" → 大文字変換 # "my file name.txt" → スペース置換 # "abc123def456" → 文字削除 # "too many spaces" → 連続文字の圧縮
小文字をすべて大文字に変換します。
echo "hello world" | tr '[:lower:]' '[:upper:]' HELLO WORLD
スペースをアンダースコアに変換します(ファイル名の正規化などに使います)。
echo "my file name.txt" | tr ' ' '_' my_file_name.txt
『-d』で指定した文字を削除します。アルファベットを削除して数字だけ取り出す例です。
echo "abc123def456" | tr -d '[:alpha:]' 123456
『-s』で連続する同じ文字を1文字に圧縮します。
echo "too many spaces" | tr -s ' ' too many spaces
『-s』と『cut』を組み合わせて、不揃いな空白のデータからフィールドを取り出します。
echo " user1 25 Tokyo " | tr -s ' ' | cut -d' ' -f2- user1 25 Tokyo
『-c』(補集合)でアルファベット・数字以外の文字をすべてスペースに変換します。
echo "hello, world! 123" | tr -c '[:alnum:]\n' ' ' hello world 123
Windows の改行コード(\r\n)から \r を削除して Unix 形式に変換します。変換が成功した場合は出力なしで処理が完了します。
tr -d '\r' < windows_file.txt > unix_file.txt
変換後に改行コードが \n だけになっているか確認します。
file unix_file.txt unix_file.txt: ASCII text
『expand -t N』でタブをスペースN個に変換します。
printf "name\tage\ncity\tcode\n" | expand -t 8 name age city code
よくあるミス
よくあるミス1: tr にファイルを引数として渡してしまう
tr はファイルを引数に取れません。ファイルを処理するにはリダイレクトで標準入力に渡す必要があります。
tr '[:lower:]' '[:upper:]' input.txt tr: extra operand 'input.txt'
リダイレクトで入力します。
tr '[:lower:]' '[:upper:]' < input.txt HELLO WORLD
よくあるミス2: 文字集合1と文字集合2の文字数が異なる
tr の変換は文字集合1の各文字を文字集合2の対応する文字に1対1で変換します。文字数が異なると GNU tr は文字集合2の最後の文字を繰り返してパディングします。
echo "abcde" | tr 'abc' 'XY' XYYde
'abc' の 'c' に対応する文字が 'Y' で埋められています。意図した変換になっているか確認してから使います。
col コマンド
『col』はテキストの整形に使うフィルタコマンドです。バックスペース文字やタブ文字を含む出力(man コマンドの出力など)をプレーンテキストに変換するときによく使います。
| オプション | 概要 |
|---|---|
| col -b | バックスペース文字(\b)を除去します。 |
| col -x | タブ文字をスペースに変換します。 |
man コマンドの出力からバックスペースを除去してプレーンテキストに保存します。man コマンドは端末向けにボールド装飾(文字\bと文字)を出力しますが、col -b でそれを除去できます。
man ls | col -b > ls_help.txt
タブをスペースに変換します。
printf "item\tvalue\n" | col -x item value printf "item\tvalue\n" | col -x | cat -A item value$
expand / unexpand の追加サンプル
複数ファイルのタブをまとめてスペースに変換して新しいファイルに書き出します。
expand -t 4 config.conf name = example_user level = 80 class = admin
『unexpand』でスペースをタブに戻します。行頭のスペースだけがタブに変換されます。
printf " hello\n world\n" | unexpand -t 4 hello world printf " hello\n world\n" | unexpand -t 4 | cat -A ^Ihello$ ^Iworld$
概要
『$ tr』はファイルを引数に取れず、標準入力のみ受け付けます。ファイルを処理するには『$ tr < ファイル』のようにリダイレクトで入力します。
Windows のテキストファイルを Linux で使う場合に改行コード(\r\n → \n)の変換でよく使われます。より高機能なテキスト変換には『sed』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。