TR(1)

名称
tr - 文字の置換を行う

書式
tr [-cs] string1 string2 [-c] -d string1 [-c] -s string1 [-c] -ds string1 string2

解説
tr ユーティリティは、指定した文字の置換えや削除を行いながら、 標準入力を標準出力にコピーします。

以下のオプションが利用可能です:

-c  string1 で指定した文字の補集合を表現します。つまり、 ``-c ab'' とした場合は ``a'' と ``b'' 以外の全ての文字が対象となります。

-d  -d オプションは、入力から対象文字を削除します。

-s  -s オプションは、最後の引数 (string1 か string2 のどちらか) に含まれている文字が、入力の中に連続して現れるとき、 それを1 文字に圧縮します。この処理は、削除と置換が全て終った後に行われます。

書式の最初の形式では、 string1 の1文字目は string2 の 1 文字目と置き換え...というように、 string1 に含まれる文字は string2 に置き換えられます。もし string1 が string2 よりも長い場合には、 string2 の最後の文字が不足ぶんだけ続いているものとみなされます。

書式の 2 番目の形式では、 string1 に含まれる文字は入力から削除されます。

書式の 3 番目の形式では、 string1 に含まれる文字は、 -s オプションの解説の通りに圧縮されます。

書式の 4 番目の形式では、 string1 に含まれる文字は入力から削除され、さらに string2 に含まれる文字が -s オプションの解説の通りに圧縮されます。

string1 と string2 での文字集合の指定には、以下のような決まりがあります。

character
    以下で示したものを除く、その文字自身を表すキャラクタ。

\octal
    バックスラッシュに、1 から 3 桁の 8 進数が続いたものは、 そのコードに対応する文字を表現します。この 8 進数のシーケンスの直後に 数字を文字として指定したい場合には、 8 進数のシーケンスの左側を 0 で埋めて、シーケンスが 3 桁いっぱいになるように してください。

\character
    特定の特殊文字がバックスラッシュの後に続くものは、特殊な値に対応します。

    \a <alert character>
    \b <backspace>
    \f <form-feed>
    \n <newline>
    \r <carriage return>
    \t <tab>
    \v <vertical tab>

    これら以外のバックスラッシュに続く文字は、その文字自身に対応します。

c-c 両端を指定することにより、文字の範囲を表します。両端を含みます。

[:class:]
    定義済みの文字クラスに属する全ての文字を表現します。 クラス名は、以下の通りです:

    alnum <alphanumeric characters>
    alpha <alphabetic characters>
    blank <blank characters>
    cntrl <control characters>
    digit <numeric characters>
    graph <graphic characters>
    lower <lower-case alphabetic characters>
    print <printable characters>
    punct <punctuation characters>
    space <space characters>
    upper <upper-case characters>
    xdigit <hexadecimal characters>

    ``upper'' と ``lower'' を除くクラスでは、クラスに含まれる文字の 順序は規定されていません。``upper'' と ``lower'' では、 文字は昇順に並んでいます。

    各クラスにどのような ASCII 文字が含まれているかという情報については、 ctype(3) および関連マニュアルを参照してください。

[=equiv=]
    全ての文字、もしくは equiv と同じ同値関係クラスに属する区分要素を表します。もし、 同値関係クラス内で 2 次的な順序付けが存在する場合、 文字は昇順に並べられます。存在しない場合には、 符号化された値に従った順序付けがなされます。 同値関係クラスの例としては、スペイン語における ``c'' と ``ch'' などが あげられます。英語にはこのような同値関係クラスはありません。

[#*n]
    # で指定された文字の n 回の繰り返しを表現します。この表現は、 string2 で指定されたときのみ有効です。もし n が省略されたか 0 であった場合は、 string2 は string1 の長さを満たす長さのシーケンスとして解釈されます。 n が 0 で始まる場合には 8 進数として、それ以外の場合は 10 進数として 解釈されます。

    tr ユーティリティは、成功した場合は 0 を、エラーが起きた場合には 0 より大きな値を 返します。

使用例
以下は、シェルに対して与えた例です:

file1 に含まれる単語 (最大限まで連続させた文字の並び) のリストを、 各行 1 エントリで出力します。

    tr -cs [:alpha:] \n < file1

file1 の内容をすべて大文字にします。

    tr [:lower:] [:upper:] < file1

表示不可能な文字を file1 から取り除きます。

    tr -cd [:print:] < file1

互換性
伝統的な BSD の実装および POSIX 標準では、文字の 範囲指定には ``c-c'' という文法を用いますが、 AT&T UNIX の実装では伝統的に ``[c-c]'' を用いています。 System V のシェルスクリプトは、文字の置換を行おうとする 場合にはうまく動作するはずです。つまり、``tr [a-z] [A-Z]'' と指定した場合には、 string1 の ``['' が string2 の ``['' に変換されるため、うまく動作します。 しかし、シェルスクリプトが、``tr -d [a-z]'' というコマンドのように 文字の削除や圧縮を行う場合には、``['' と ``]'' の文字が 削除や圧縮の対象に含まれてしまいます。古い実装の System V では このようには動作しません。さらに、``a''、``-''、``z''という 3 つの 文字を表現するのに、``a-z'' と記述するような、 その並びに依存しているあらゆるスクリプトは、``a\-z'' と書き直す 必要があります。

tr ユーティリティは昔から、入力における NUL バイトの操作を 禁止されていました。さらに、入力から NUL を取り除いていました。 この実装では、この振る舞いはバグとみなされ、削除されました。

tr ユーティリティは昔から、たとえば 2 つの文字列が指定されない限り -c および -s オプションを無視する、などの文法上の誤りを極端なまでに許していました。 この実装では、不正な文法は許されなくなっているはずです。

規格
tr ユーティリティは p1003.2 互換です。 string2 が string1 よりも短い場合に string2 の最後の文字が複製されるという機能が POSIX では許可されてはいますが、 必須機能ではないということに注意を払っておくべきです。 シェルスクリプトを他の POSIX システムへ port しやすくするためには、 この振る舞いに頼らずに、``[#*]''という表現を使うべきです。