[ << ] | [ >> ] | [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 characters to another. | |
9.1.3 繰り返しの圧縮と削除 | Squeezing repeats and deleting. | |
9.1.4 警告メッセージ | Warning messages. |
set1とset2の引数の書式は,正規表現の書式に似ています.しか し正規表現ではなく,文字のリストのみです.これらの文字列のほとんどの文 字は単にその文字自身を表しますが,利便性のため,文字列には以下でリスト アップされた速記を含むことができます.そのうち,以下で注意する set1またはset2のみでしか利用できないものもあります.
以下でリストアップされていない,文字が続くバックスラッシュは,エラーメッ セージを発生します.
表記方法の`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
構文`[=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の補語の最 初の要素)ゼロバイトのみ変換されるためです.
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:
ところで,上記の慣例は範囲を使用しているので移植性がありません.
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' |
uniq
を`-d'オプションで実行します.
#!/bin/sh cat "$@" \ | tr -s '[:punct:][:blank:]' '\n' \ | tr '[:upper:]' '[:lower:]' \ | uniq -d |
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を厳密に遵守
するため,以下の警告とエラーのメッセージをオフにします.それ以外の場合,
以下の診断結果を出力します.
tr
は,set2が使用されないため,デフォ
ルトで使用方法のメッセージを出力し終了します.POSIX仕様では,
この場合set2は無視する必要があると述べられています.黙って引数を
無視するのは悪い考えです.
GNU tr
は,BSDやSystem Vとの完全な互換性を提供していませ
ん.例えば,POSIXの概念`[:alpha:]',`[=c=]',そし
て`[c*10]'の解釈を利用不可にすることはできません.また,GNU
tr
は,ゼロバイトを保護する方法を提供できない伝統的なUnixバー
ジョンと異なり,ゼロバイトを自動的に削除できません.
expand
: タブをスペースに変換
expand
は,与えられたそれぞれのfile,または,与えられな
い場合や`-'のfileの場合は標準入力の内容を,タブ文字を適切な
数のスペースに変換して,標準出力に書き出します.概要です.
expand [option]... [file]... |
デフォルトで,expand
は全てのタブをスペースに変換します.それ
は全ての出力でバックスペース文字を維持します.それらはタブ計算に対し,
列の数を減少させます.デフォルトの動作は`-8'(タブをそれぞれ八列
に設定する)と同じです.
プログラムは,以下のオプションを受け入れます.2. 共通のオプションも参 照してください.
古いシステムでは,expand
は時代遅れのオプション
`-tab1[,tab2]...'をサポートしていて,そこではタ
ブストップをカンマで分離するはずです.POSIX 1003.1-2001
(see section 2.6 標準への準拠)ではこれを許可していません.代わりに
`-t tab1[,tab2]...'を使用してください.
unexpand
: スペースをタブに変換する
unexpand
は,与えられたそれぞれのfile,または与えられな
い場合や`-'のfileに対しては標準入力の内容を,二つ以上のスペー
スやタブ文字の文字列を,二つ以上のスペースやタブ文字を,必要とされる数
のスペースを可能な限り連続するタブに変換しながら,内容を標準出力に書き
出します.概要です.
unexpand [option]... [file]... |
デフォルトで,unexpand
は,最初のスペースとタブ(前にあるもの
が全て非スペース文字や非タブ文字となるもの)だけを,ぞれぞれの行で変換
します.それは,出力でバックスペース文字を維持します.タブの計算で列が
減少します.デフォルトで,タブは八列単位に設定されます.
プログラムは以下のオプションを受け入れます.2. 共通のオプションも参照 してください.
古いシステムでは,unexpand
は時代遅れのオプション
`-tab1[,tab2]...'をサポートしていて,そこではタ
ブストップをカンマで分離するはずです.POSIX 1003.1-2001
(see section 2.6 標準への準拠)ではこれを許可していません.代わりに
`--first-only -t tab1[,tab2]...'を使用してくだ
さい.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |