TR(1)

名称
tr - 文字の置換

書式
tr [-Ccsu] string1 string2
tr [-Ccu] -d string1
tr [-Ccu] -s string1
tr [-Ccu] -ds string1 string2

解説
tr ユーティリティは、選択された文字を置き換え、または削除しながら 標準入力を標準出力にコピーします。

以下のオプションが利用できます:

-C  string1 に含まれる文字の補集合を表します。 つまり “-C ab” は、 ‘a’ と ‘b’ を除く全ての文字を含みます。

-c  -C と同じですが、 string1 に含まれるバイト値の補集合となります。

-d  入力から、 string1 に含まれる文字を削除します。

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

-u  出力がバッファリングされないことを保証します。

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

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

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

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

string1, string2 の文字の集合を指定するのに、以下のような記述方法が利用できます:

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

\octal
    バックスラッシュに続き、1〜3 桁の 8 進数が続いたものは、 その値を符号化した文字を表現します。この 8 進数の並びに続いて 数字を文字として指定したい場合には、8 進数の並びが 3 桁と なるように、8 進数の上位桁 (左) に 0 を埋めてください。

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

    \a | <ベル文字>
    \b | <バックスペース>
    \f | <フォームフィード>
    \n | <改行>
    \r | <復帰>
    \t | <水平タブ>
    \v | <垂直タブ>

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

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

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

    alnum | <英数字>
    alpha | <英字>
    cntrl | <コントロール文字>
    digit | <数字>
    graph | <グラフィック文字>
    lower | <英小文字>
    print | <表示可能文字>
    punct | <句読点>
    space | <空白文字>
    upper | <英大文字>
    xdigit | <16進数>

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

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

[=equiv=]
    equiv と同じ同値関係クラスに属する全ての文字を表します。 これらはエンコード値の順序となります。

[#*n]
    # で指定された n 個の文字の繰り返しを表現します。この表現は、 string2 で指定されたときのみ有効です。 もし n が省略された場合、または 0 の場合は、 string2 が string1 の長さを満たすような、十分大きな値として解釈されます。 n は、0 で始まる場合には 8 進数として、そうでない場合には 10 進数として 解釈されます。

環境変数
LANG, LC_ALL, LC_CTYPE, LC_COLLATE の環境変数が、 environ(7) の記述通りに、 tr の実行に影響します。

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

file1 に含まれる単語 (文字の最大長の並び) のリストを、 各行につき 1 つずつ出力します。

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

file1 の内容を大文字に変換します。

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

表示できない文字を file1 から削除します。

    tr -cd [:print:] < file1

発音区分記号を、 ‘e’ のアクセント付きバリアントすべてから削除します。

    tr [=e=] e

診断

互換性
古くからの BSD の実装および POSIX 標準では、文字の 範囲指定には ``c-c'' という文法を用いますが、 古い System V の実装では ``[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.1-2001 に適合しています。

string2 が string1 よりも短い場合に string2 の最後の文字が複製される機能は、 POSIX では許されていますが必須ではないことに注意して下さい。 他の POSIX システムへの可搬性のあるシェルスクリプトを 作ろうとするならば、この振る舞いを当てにせずに、``[#*]'' と いう表現を使うべきです。 -u オプションは p1003.1-2001 標準の拡張です。