GNU 版 tr は --help および --version オプションも受け付ける。
このマニュアルページは GNU 版 tr について記述したものである。 tr は標準入力を標準出力にコピーするが、その際に以下のうちのいずれかを行う。
string1 および (与えられていれば) string2 引き数は順序を持っ た文字のセットを定義する。以下の説明ではこれを set1 および set2 と呼ぶ。 これらの文字セットが入力に存在すると、 tr はその文字に対して動作を行う。 --complement (-c) オプションは set1 をその補集合 (set1 に含まれない文字すべ て) に置換する。
string1 および string2 引き数のフォーマットは正規表現と似 たものになっている。しかし正規表現そのものではなく、実は文字の並びに 過ぎない。これらの文字列の中に記された文字は、ほとんどの場合はその文字 自身を指す。文字列には便宜上以下のような短縮形を用いることもできる。た だし、 string1 または string2 のいずれかにしか用いることの できないものもある。記述に注意すること。
バックスラッシュによるエスケープ。以下以外の文字がバックスラッシュに続 いた場合はエラーメッセージが出る。
範囲指定。 `m-n' といった記述は、 m から n ま でのすべての文字を昇順に展開した文字列になる。 m は n の前 になければならず、これに反した場合はエラーとなる。例えば `0-9' は `0123456789' を指定したのと同じことになる。 System V 版の tr では範囲を指定する際に角括弧 `[]' を用いるが、 GNU 版 tr ではこの形式はサポートしていない。ただしこの形式における変換指定は string1 と string2 の間で角括弧が対応していれば有効である。
繰り返し文字。 string2 における `[c*n]' といった記述 は n 個の文字 c に展開される。したがって `[y*6]' は `yyyyyy' になる。 string2 における `[c*]' は set2 を set1 と同じ長さにするために必要な個数の文字 c に展開される。 n が 0 ではじまる場合は 8 進数とみなされ、それ以外の場合は 10 進 数とみなされる。
文字クラス。 `[:class-name:]' といった記述はあらかじめ定義された 文字クラス class-name のすべての文字に展開される。文字クラスには 特定の順序は定義されていない。ただし `upper' と `lower' クラスのみは例 外で、昇順に展開される。 --delete (-d) および --squeeze-repeats (-s) の両方が指定された場合は、 string2 にはどんな文字ク ラスでも用いることができる。それ以外の場合は、 string2 に指定で きるのは `lower' および `upper' のみで、しかもそれぞれに対応するクラス (`lower' には `upper'、 `upper' には `lower') が string1 の同じ 位置に指定されていなければならない。この場合は大文字小文字が変換される。 文字クラス名を以下に示す。これら以外の名前が指定された場合にはエラーと なる。
等価クラス。 `[=c=]' といった記述は c と等価な文字に展開さ れる。このとき順序は定義されない。等価クラスは英語以外のアルファベット をサポートするために最近発明されたものである。しかし現在のところこれら の定義や内容指定に標準的な方法はないようである。したがって GNU 版 tr でも完全には実装されていない。それぞれの文字の等価クラスはその文字から のみ構成されている。したがってこの機能は現在のところ役に立たない。
tr は string1 と string2 の両方が指定されていて、 --delete (-d) オプションが指定されていない場合には変換を行う。 tr は入力のうち set1 にある文字を set2 の対応する位置にある文字に変換する。 set1 に無い文字はそのまま出力される。もし文字が set1 に2回以上現われ、 set2 の対応する文字がすべて同じでない場合には、最後の文字だけが使われ る。例えば以下の二つのコマンドは等価である:
tr aaa xyz tr a z
tr の良く用いられる使用法としては、小文字の大文字への変換があげられる。い ろいろなやり方が可能であるが、以下に例を3つほど示す。
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ tr a-z A-Z tr '[:lower:]' '[:upper:]'
tr が変換を行う際には、 set1 と set2 は通常同じ長さでなければならない。 set1 が set2 より短い場合には、 set2 の尾部の余りは無視される。
逆に set1 を set2 より長く指定すると、動作は予測できなくなる。 POSIX.2 によれば、結果は定義されない。このような場合、 BSD 版 tr では set2 の足りない部分を最後の文字で埋め、 set1 と同じ長さにする。 また System V 版 tr は set1 の尾部を切り捨てて set2 と同じ長さにする。
デフォルトでは GNU 版 tr は BSD 版 tr と同じように振る舞う。 また --truncate-set1 (-t) オプションが指定された場合には、 GNU 版 tr は System V 版 tr のように振る舞う。このオプションは変換以外の点に関しては無視される。
System V 版 tr 的な振る舞いの下では、 BSD 版の有名な用法:
tr -cs A-Za-z0-9 '\012'
--delete (-d) オプションだけが指定された場合は、 tr は入力のうち set1 にある文字を削除する。
--squeeze-repeats (-s) オプションだけが指定された場合には、 tr は入力のうち、 set1 にある文字の繰り返しを、その文字 1 字に置き換える。
--delete と --squeeze-repeats の両方のオプションが指定された場合 には、 tr はまず set1 にある文字を削除し、残りのうち set2 にある文字の繰り返しを 圧縮する。
The --squeeze-repeats オプションは変換と共に用いることもできる。この 場合には tr はまず変換を行い、残りの文字のうち set2 にあるものを圧縮する。
以下にこれらのオプションの組み合わせの利用例を示す:
内容が 0 のバイトを削除する:
すべての単語をそれ自身のみからなる行に変換する。以下はアルファベット文 字、数字以外の文字を改行文字に変換し、改行文字の繰り返しを一つの改行文 字に圧縮する:
改行文字の繰り返しを一つの改行文字に変換する。
GNU 版 tr は、以下のオプションも (他のどんなオプションとの組み合わせでも) 受け付ける。
環境変数 POSIXLY_CORRECT を指定すると、 POSIX.2 との厳密な互換性を保証 するために、警告およびエラーメッセージのいくつかが出力されなくなる。通 常ならば以下のような状況で出るメッセージである。
1. --delete オプションが指定されており、 --squeeze-repeats が指定されておらず、かつ string2 が与えられている場合には、 GNU 版 tr はデフォルトでは使用法のメッセージを表示して終了する。なぜならこのとき string2 は利用されないからである。しかし POSIX 規格によれば、こ の場合は string2 は単に無視されなければならない。しかし引き数を 黙って無視するのは良くない仕様だと思うのだが。
2. あいまいな 8 進数エスケープが指定された場合。例えば \400 は実際に は \40 と数字 0 の並びと解釈される。なぜなら 8 進数の 400 が対応する バイトは存在しないからである。
GNU 版 tr は BSD や System V との互換性は保証していないことに注意すること。例を 挙げれば、 POSIX 定義にある [:alpha:] や [=c=]、 [c*10] といった指定の 解釈を止めさせるようなオプションは存在しない。また GNU 版 tr は内容が 0 のバイトを自動的には削除しない。一方これまでの UNIX 版では、 このバイトを残す方法の方が存在しない。