[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このコマンドは,個別に文字を処理します.
9.1 tr : 文字の変換,圧縮,そして/または,削除 | Translate, squeeze, and/or delete characters. | |
9.2 expand : タブをスペースに変換 | Convert tabs to spaces. | |
9.3 unexpand : スペースをタブに変換する | Convert spaces to tabs. |
tr
: 文字の変換,圧縮,そして/または,削除 概要です.
tr [option]… set1 [set2] |
tr
は標準入力を標準出力にコピーし,そのとき以下の処理の一つを
実行します.
変換,さらに結果の繰り返し文字の圧縮.
繰り返し文字の圧縮.
文字の削除.
文字の削除後,結果から繰り返し文字の圧縮.
set1と(与えられている場合)set2引数は,順番付けされた文字を
定義し,以下のset1とset2を参照します.これらの組は,
tr
が処理する入力文字です.`--complement'
(`-c')オプションは,set1をその補集合(set1に無い全て
の文字)に置換します.
終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.
9.1.1 文字の組の指定 | Specifying sets of characters. | |
9.1.2 変換 | Changing one set of characters to another. | |
9.1.3 繰り返しの圧縮と削除 | Squeezing repeats and deleting. | |
9.1.4 警告メッセージ | Warning messages. |
set1とset2の引数の書式は,正規表現の書式に似ています.しか し正規表現ではなく,文字のリストのみです.これらの文字列のほとんどの文 字は単にその文字自身を表しますが,利便性のため,文字列には以下でリスト アップされた速記を含むことができます.そのうち,以下で注意する set1またはset2のみでしか利用できないものもあります.
以下でリストアップされていない,文字が続くバックスラッシュは,エラーメッ セージを発生します.
Control-G.
Control-H.
Control-L.
Control-J.
Control-M.
Control-I.
Control-K.
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]'の表記は,文字cのn個 のコピーに展開されます.このため,`[y*6]'は`yyyyyy'と同じで す.set2での`[c*]'の表記は,set2をset1と 同じ長さにするのに必要なたくさんのcのコピーに展開されます. nが`0'で始まる場合は八進数に,それ以外では十進数だと解釈さ れます.
`[:class:]'の表記は,(あらかじめ定義された)クラス
class にある全ての文字に展開されます.文字は,特定の順序で展開さ
れませんが,upper
とlower
クラスは,昇順に展開されます.
`--delete' (`-d')と`--squeeze-repeats'
(`-s')オプションが両方与えられている場合,すべての文字クラスを
set2で使用することが可能です.それ以外の場合,文字クラス
lower
とupper
はset2に適用され,さらに,対応する(そ
れぞれupper
とlower
の)文字クラスがset1の位置に相対
的に同じものが指定されている場合だけそうなります.これは,大文字小文字
の変換の指定です.クラス名は以下で与えられます.無効なクラス名が与えら
れた場合,結果としてエラーとなります.
alnum
文字と数字.
alpha
文字.
blank
水平方向の空白.
cntrl
コントロール文字.
digit
数字.
graph
スペースを含まない,印刷可能な文字.
lower
小文字.
print
スペースを含む,印刷可能な文字.
punct
句読点文字.
space
水平垂直の空白.
upper
大文字.
xdigit
16進数の数字.
構文`[=c=]'は,cと等価な文字の全てに,特定の順序を持
たずに展開されます.等価なクラスは,英語以外のアルファベットをサポート
する目的で,比較的最近発明されました.しかし,それらの定義や内容を決定
する標準的な方法はなさそうです.そのため,GNU tr
では,
完全には実装されていません.それぞれの文字の等価クラスは,その文字から
のみ構成されていて,特定の利用価値はありません.
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*]' |
`--delete' (`-d')オプションのみ与えられたとき,
tr
は,set1にあるあらゆる入力文字を削除します.
`--squeeze-repeats' (`-s')オプションのみ与えられたとき,
tr
は,set1にある,それぞれの入力で繰り返される文字の並
びを,その文字が一度だけ表れるように置換します.
`--delete'と`--squeeze-repeats'の両方が与えられた場合,
tr
は,最初にset1を用いて削除を実行し,set2を用い
て残りの文字から繰り返しを圧縮します.
`--squeeze-repeats'オプションは,変換時にも利用でき,その場合,
tr
は,最初に変換を実行し,set2を用いて残りの文字から繰
り返しを圧縮します.
ここに,オプションの様々な組合せの表現例をいくつかあげます.
全てのゼロバイトを削除.
tr -d '\000' |
全ての単語を単独行にします.これは,全ての非英数文字を改行に変換し,繰 り返される改行になっているそれぞれの文字列を単一の改行に圧縮します.
tr -cs '[:alnum:]' '[\n*]' |
繰り返される改行のそれぞれの並びを,単一の改行に変換します.
tr -s '\n' |
ドキュメントで単語の二重の出現を見付けます.例えば,改行で分離されてい
る繰り返している単語"the the"と書くこともよくあります.以下のbourne
シェルスクリプトは,最初に句読点と空白文字の並びを単一の改行文字に変換
する動作を行います.それでそれぞれの"単語"が単独行に書かれます.次に
全ての大文字を小文字に置き換え,最後に繰り返している単語だけを出力する
ために,uniq
を`-d'オプションで実行します.
#!/bin/sh cat "$@" \ | tr -s '[:punct:][:blank:]' '\n' \ | tr '[:upper:]' '[:lower:]' \ | uniq -d |
文字の小さな組を削除することは,一般的に簡単です.例えば,すべての `a',`x',そして`M'を削除するために,以下のようにします.
tr -d axM |
しかし,これらの文字の一つが`-'のとき,`-'には特別な意味があ
るので,ちょっとトリッキーになります.上記と同じ作業を実行し,さらにす
べての`-'文字を削除するため,tr -d -axM
を試してみるかもし
れませんが,tr
は`-a'をコマンドラインオプションと解釈
しようとするので失敗するでしょう.代わりに,文字列の間にハイフンを
tr -d a-xM
のように書いてみても,tr
はa-x
を三文
字ではなく`a'…`x'の範囲として解釈するので動作しません.
問題を解決する方法の一つは,文字のリストの最後にハイフンを書くことです.
tr -d axM- |
より一般的に,文字クラスの表記[=c=]
を使用し,`-'(または,
任意の文字)を`c'の位置に書きます.
tr -d '[=-=]axM' |
上記の例で使用しているシングルクオートは,角括弧をシェルが解釈すること を防ぎます.
環境変数POSIXLY_CORRECT
を設定すると,POSIXを厳密に遵守
するため,以下の警告とエラーのメッセージをオフにします.それ以外の場合,
以下の診断結果を出力します.
`--delete'オプションが与えられているが,
`--squeeze-repeats'が与えられておらず,set2が与えられてい
るとき,GNU tr
は,set2が使用されないため,デフォ
ルトで使用方法のメッセージを出力し終了します.POSIX仕様では,
この場合set2は無視する必要があると述べられています.黙って引数を
無視するのは悪い考えです.
曖昧な八進数のエスケープが与えられたときです.例えば`\400'は,八 進数の400の値が単一バイトに適さないので,実際には`0'が後置された `\40'になります.
GNU tr
は,BSDやSystem Vとの完全な互換性を提供していませ
ん.例えば,POSIXの概念`[:alpha:]',`[=c=]',そし
て`[c*10]'の解釈を利用不可にすることはできません.また,GNU
tr
は,ゼロバイトを保護する方法を提供できない伝統的なUnixバー
ジョンと異なり,ゼロバイトを自動的に削除できません.
expand
: タブをスペースに変換 expand
は,与えられたそれぞれのfile,または,与えられな
い場合や`-'のfileの場合は標準入力の内容を,タブ文字を適切な
数のスペースに変換して,標準出力に書き出します.概要です.
expand [option]… [file]… |
デフォルトで,expand
は全てのタブをスペースに変換します.それ
は全ての出力でバックスペース文字を維持します.それらはタブ計算に対し,
列の数を減少させます.デフォルトの動作は`-8'(タブをそれぞれ八列
に設定する)と同じです.
プログラムは,以下のオプションを受け入れます.共通のオプションも参 照してください.
一つのタブストップのみ与えられた場合,タブをtab1個の別々のスペー ス(デフォルトで8)に設定します.それ以外の場合,タブをtab1, tab2,…(0から番号付けされる)列に設定し,与えられた最後のタ ブストップ以降のあらゆるタブを単一のスペースで置換します.タブストップ は,カンマではなく空白で分けることも可能です.
古いシステムでは,expand
は時代遅れのオプション
`-tab1[,tab2]…'をサポートしていて,そこではタ
ブストップをカンマで分離するはずです.POSIX 1003.1-2001
(see section 標準への準拠)ではこれを許可していません.代わりに
`-t tab1[,tab2]…'を使用してください.
それぞれの行の最初のタブ(前にあるものが全て非スペース文字や非タブ文字 となるもの)をスペースに変換します.
終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.
unexpand
: スペースをタブに変換する unexpand
は,与えられたそれぞれのfile,または与えられな
い場合や`-'のfileに対しては標準入力の内容を,二つ以上のスペー
スやタブ文字の文字列を,二つ以上のスペースやタブ文字を,必要とされる数
のスペースを可能な限り連続するタブに変換しながら,内容を標準出力に書き
出します.概要です.
unexpand [option]… [file]… |
デフォルトで,unexpand
は,最初のスペースとタブ(前にあるもの
が全て非スペース文字や非タブ文字となるもの)だけを,ぞれぞれの行で変換
します.それは,出力でバックスペース文字を維持します.タブの計算で列が
減少します.デフォルトで,タブは八列単位に設定されます.
プログラムは以下のオプションを受け入れます.共通のオプションも参照 してください.
一つのタブストップのみ与えられた場合,タブを,デフォルトの8の代わりに, それぞれtab1スペースに設定します.それ以外の場合,タブを tab1列,tab2列,… (0から番号付けされる)に設定し,与 えられたタブストップ以降のスペースタブは,変更されずに残ります.タブス トップはカンマではなく空白で分離することも可能です.オプションは暗黙に `-a'オプションを指定します.
古いシステムでは,unexpand
は時代遅れのオプション
`-tab1[,tab2]…'をサポートしていて,そこではタ
ブストップをカンマで分離するはずです.POSIX 1003.1-2001
(see section 標準への準拠)ではこれを許可していません.代わりに
`--first-only -t tab1[,tab2]…'を使用してくだ
さい.
最初のものだけでなく,全ての二つ以上のスペースやタブをタブに変換します.
終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Akihiro Sagawa on June, 8 2005 using texi2html 1.70.