Next: Squeezing, Previous: Character sets, Up: tr invocation
set1とset2の両方が与えられ,--delete (-d)オプションが与えられていない場合,trは変換を実 行します.trは,set1にある入力のぞれぞれの文字を,対応 するset2の文字に変換します.set1に無い文字は,そのまま変換 されず通過します.set1の文字が一回以上現われ,set2の対応す る文字が全て同じではない場合,最後の一つのみ使用されます.例えば,以下 の二つのコマンドは等価です.
tr aaa xyz tr a z
trの一般的な使用法は,小文字を大文字に変換することです.これ を行なう方法はたくさんあるはずです.その三つを以下に書きます.
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ tr a-z A-Z tr '[:lower:]' '[:upper:]'
しかし,上記のa-z
のような範囲の使用には移植性がありません.
trが変換を実行しているとき,set1とset2は,通常同 じ長さです.set1がset2より短い場合,set2の終りの余分 な文字は無視されます.
一方,set1をset2より大きくすることは移植性がありません. POSIXでは,その結果が未定義だと述べています.この場合,BSD trは,set2を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'
それは,全ての非英数字を改行に変換する代わりに,(set1の補語の最 初の要素)ゼロバイトのみ変換されるためです.
ところで,上記の慣例は範囲を使用しているので移植性がありません. POSIXがtrに文句をいう場合,ここでは以下のように書 いた方が良いでしょう.
tr -cs '[:alnum:]' '[\n*]'