次: , 前: Character sets, 上: tr invocation


9.1.2 変換

set1set2の両方が与えられ,--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が変換を実行しているとき,set1set2は,通常同 じ長さです.set1set2より短い場合,set2の終りの余分 な文字は無視されます.

一方,set1set2より大きくすることは移植性がありません. POSIXでは,その結果が未定義だと述べています.この場合,BSD trは,set2set2の最後文字で必要なだけ繰り返すこ とでset1の長さに引き延ばします.System V trは, set1set2の長さに切り詰めます.

デフォルトで,gnu trはBSD trのようにこの状態 を処理します.--truncate-set1 (-t)オプションが与えら れている場合,gnu trはSystem V trのようにこの 状態を処理します.このオプションは,変換以外の処理では無視されます.

この場合,System V trのように動作させると,比較的一般的なBSD の表現は壊れます.

     tr -cs A-Za-z0-9 '\012'

それは,全ての非英数字を改行に変換する代わりに,(set1の補語の最 初の要素)ゼロバイトのみ変換されるためです.

ところで,上記の慣例は範囲を使用しているので移植性がありません. POSIXtrに文句をいう場合,ここでは以下のように書 いた方が良いでしょう.

     tr -cs '[:alnum:]' '[\n*]'