言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. tr / col / expand

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』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。