[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

9. 文字の処理

このコマンドは,個別に文字を処理します.

9.1 tr: 文字の変換,圧縮,そして/または,削除  Translate, squeeze, and/or delete characters.
9.2 expand: タブをスペースに変換  Convert tabs to spaces.
9.3 unexpand: スペースをタブに変換する  Convert spaces to tabs.


9.1 tr: 文字の変換,圧縮,そして/または,削除

概要です.

 
tr [option]... set1 [set2]

trは標準入力を標準出力にコピーし,そのとき以下の処理の一つを 実行します.

set1と(与えられている場合)set2引数は,順番付けされた文字を 定義し,以下のset1set2を参照します.これらの組は, trが処理する入力文字です.`--complement' (`-c')オプションは,set1をその補集合(set1に無い全て の文字)に置換します.

9.1.1 文字の組の指定  Specifying sets of characters.
9.1.2 変換  Changing one characters to another.
9.1.3 繰り返しの圧縮と削除  Squeezing repeats and deleting.
9.1.4 警告メッセージ  Warning messages.


9.1.1 文字の組の指定

set1set2の引数の書式は,正規表現の書式に似ています.しか し正規表現ではなく,文字のリストのみです.これらの文字列のほとんどの文 字は単にその文字自身を表しますが,利便性のため,文字列には以下でリスト アップされた速記を含むことができます.そのうち,以下で注意する set1またはset2のみでしか利用できないものもあります.

Backslash escapes

以下でリストアップされていない,文字が続くバックスラッシュは,エラーメッ セージを発生します.

`\a'
Control-G.
`\b'
Control-H.
`\f'
Control-L.
`\n'
Control-J.
`\r'
Control-M.
`\t'
Control-I.
`\v'
Control-K.
`\ooo'
oooで与えられる値の文字で,一桁から三桁までの八進数.
`\\'
バックスラッシュ.

範囲

表記方法の`m-n'は,mからnまで昇順に,全て の文字に展開されます.mは,対照でnの前であるべきです.そう でない場合,結果としてエラーとなります.例としては,`0-9'は `0123456789'と同じです.

GNU trは,範囲を囲む角括弧を使用するSystem V構文をサポー トしません.その書式で指定された変換は,括弧はそれ自身に変換されるので, 期待したように動作します.しかし,期待しない動作を行なうときもあるので 避けるべきです.例えば,`tr -d '[0-9]''は数字だけでなく括弧も削除 します.

多くの歴史的に一般的なものと,範囲の使用の受け入れには移植性がありませ ん.例えば,EBCDICのホストでは,`A-Z'の範囲を使用すると, ASCIIでは`A'から`Z'までが不連続なので期待したよう に動作しません.POSIXに準拠しているバージョンのtr に依存している場合,これを回避する最善の方法は,文字クラスを使用するこ とです(以下を参照して下さい).それ以外では,範囲内のメンバーを列挙する ことが最も移植性がある(そして最も醜い)方法です.

繰り返される文字

set2での`[c*n]'の表記は,文字cn個 のコピーに展開されます.このため,`[y*6]'は`yyyyyy'と同じで す.set2での`[c*]'の表記は,set2set1と 同じ長さにするのに必要なたくさんのcのコピーに展開されます. nが`0'で始まる場合は八進数に,それ以外では十進数だと解釈さ れます.

文字クラス

`[:class:]'の表記は,(あらかじめ定義された)クラス class にある全ての文字に展開されます.文字は,特定の順序で展開さ れませんが,upperlowerクラスは,昇順に展開されます. `--delete' (`-d')と`--squeeze-repeats' (`-s')オプションが両方与えられている場合,すべての文字クラスを set2で使用することが可能です.それ以外の場合,文字クラス lowerupperset2に適用され,さらに,対応する(そ れぞれupperlowerの)文字クラスがset1の位置に相対 的に同じものが指定されている場合だけそうなります.これは,大文字小文字 の変換の指定です.クラス名は以下で与えられます.無効なクラス名が与えら れた場合,結果としてエラーとなります.

alnum
文字と数字.
alpha
文字.
blank
水平方向の空白.
cntrl
コントロール文字.
digit
数字.
graph
スペースを含まない,印刷可能な文字.
lower
小文字.
print
スペースを含む,印刷可能な文字.
punct
句読点文字.
space
水平垂直の空白.
upper
大文字.
xdigit
16進数の数字.

等価なクラス

構文`[=c=]'は,cと等価な文字の全てに,特定の順序を持 たずに展開されます.等価なクラスは,英語以外のアルファベットをサポート する目的で,比較的最近発明されました.しかし,それらの定義や内容を決定 する標準的な方法はなさそうです.そのため,GNU trでは, 完全には実装されていません.それぞれの文字の等価クラスは,その文字から のみ構成されていて,特定の利用価値はありません.


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の補語の最 初の要素)ゼロバイトのみ変換されるためです.

By the way, the above idiom is not portable because it uses ranges. Assuming a POSIX compliant tr, here is a better way to write it:

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

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


9.1.3 繰り返しの圧縮と削除

`--delete' (`-d')オプションのみ与えられたとき, trは,set1にあるあらゆる入力文字を削除します.

`--squeeze-repeats' (`-s')オプションのみ与えられたとき, trは,set1にある,それぞれの入力で繰り返される文字の並 びを,その文字が一度だけ表れるように置換します.

`--delete'と`--squeeze-repeats'の両方が与えられた場合, trは,最初にset1を用いて削除を実行し,set2を用い て残りの文字から繰り返しを圧縮します.

`--squeeze-repeats'オプションは,変換時にも利用でき,その場合, trは,最初に変換を実行し,set2を用いて残りの文字から繰 り返しを圧縮します.

ここに,オプションの様々な組合せの表現例をいくつかあげます.


9.1.4 警告メッセージ

環境変数POSIXLY_CORRECTを設定すると,POSIXを厳密に遵守 するため,以下の警告とエラーのメッセージをオフにします.それ以外の場合, 以下の診断結果を出力します.

  1. `--delete'オプションが与えられているが, `--squeeze-repeats'が与えられておらず,set2が与えられてい るとき,GNU trは,set2が使用されないため,デフォ ルトで使用方法のメッセージを出力し終了します.POSIX仕様では, この場合set2は無視する必要があると述べられています.黙って引数を 無視するのは悪い考えです.

  2. 曖昧な八進数のエスケープが与えられたときです.例えば`\400'は,八 進数の400の値が単一バイトに適さないので,実際には`0'が後置された `\40'になります.

GNU trは,BSDやSystem Vとの完全な互換性を提供していませ ん.例えば,POSIXの概念`[:alpha:]',`[=c=]',そし て`[c*10]'の解釈を利用不可にすることはできません.また,GNU trは,ゼロバイトを保護する方法を提供できない伝統的なUnixバー ジョンと異なり,ゼロバイトを自動的に削除できません.


9.2 expand: タブをスペースに変換

expandは,与えられたそれぞれのfile,または,与えられな い場合や`-'のfileの場合は標準入力の内容を,タブ文字を適切な 数のスペースに変換して,標準出力に書き出します.概要です.

 
expand [option]... [file]...

デフォルトで,expandは全てのタブをスペースに変換します.それ は全ての出力でバックスペース文字を維持します.それらはタブ計算に対し, 列の数を減少させます.デフォルトの動作は`-8'(タブをそれぞれ八列 に設定する)と同じです.

プログラムは,以下のオプションを受け入れます.2. 共通のオプションも参 照してください.

`-t tab1[,tab2]...'
`--tabs=tab1[,tab2]...'
一つのタブストップのみ与えられた場合,タブをtab1個の別々のスペー ス(デフォルトで8)に設定します.それ以外の場合,タブをtab1tab2...(0から番号付けされる)列に設定し,与えられた最後のタ ブストップ以降のあらゆるタブを単一のスペースで置換します.タブストップ は,カンマではなく空白で分けることも可能です.

古いシステムでは,expandは時代遅れのオプション `-tab1[,tab2]...'をサポートしていて,そこではタ ブストップをカンマで分離するはずです.POSIX 1003.1-2001 (see section 2.6 標準への準拠)ではこれを許可していません.代わりに `-t tab1[,tab2]...'を使用してください.

`-i'
`--initial'
それぞれの行の最初のタブ(前にあるものが全て非スペース文字や非タブ文字 となるもの)をスペースに変換します.


9.3 unexpand: スペースをタブに変換する

unexpandは,与えられたそれぞれのfile,または与えられな い場合や`-'のfileに対しては標準入力の内容を,二つ以上のスペー スやタブ文字の文字列を,二つ以上のスペースやタブ文字を,必要とされる数 のスペースを可能な限り連続するタブに変換しながら,内容を標準出力に書き 出します.概要です.

 
unexpand [option]... [file]...

デフォルトで,unexpandは,最初のスペースとタブ(前にあるもの が全て非スペース文字や非タブ文字となるもの)だけを,ぞれぞれの行で変換 します.それは,出力でバックスペース文字を維持します.タブの計算で列が 減少します.デフォルトで,タブは八列単位に設定されます.

プログラムは以下のオプションを受け入れます.2. 共通のオプションも参照 してください.

`-t tab1[,tab2]...'
`--tabs=tab1[,tab2]...'
一つのタブストップのみ与えられた場合,タブを,デフォルトの8の代わりに, それぞれtab1スペースに設定します.それ以外の場合,タブを tab1列,tab2列,... (0から番号付けされる)に設定し,与 えられたタブストップ以降のスペースタブは,変更されずに残ります.タブス トップはカンマではなく空白で分離することも可能です.オプションは暗黙に `-a'オプションを指定します.

古いシステムでは,unexpandは時代遅れのオプション `-tab1[,tab2]...'をサポートしていて,そこではタ ブストップをカンマで分離するはずです.POSIX 1003.1-2001 (see section 2.6 標準への準拠)ではこれを許可していません.代わりに `--first-only -t tab1[,tab2]...'を使用してくだ さい.

`-a'
`--all'
最初のものだけでなく,全ての二つ以上のスペースやタブをタブに変換します.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on February, 25 2004 using texi2html