Previous: Translating, Up: tr invocation [Contents][Index]
--delete (-d) オプションのみが指定された場合、tr
は、
set1 に存在する文字が入力中にあれば、それを削除する。
--squeeze-repeats (-s) オプションのみが指定され、置換が要求されていない場合、
tr
は、set1 に存在する文字が入力中に連続して現れるたびに、
その部分をただ 1 個のその文字に置き換える。
--delete と --squeeze-repeats の両方が指定された場合、
tr
は、まず set1 を使って削除を行い、
その後で、残っている文字に対して、set2 を使って連続する同一文字の圧縮を行う。
--squeeze-repeats オプションは、置換の際に使用することもできる。
その場合、tr
は、まず置換を実行し、その後で、置換結果に対して、
set2 を使って連続する同一文字の圧縮を行う。
例をいくつか挙げて、オプションの様々な組み合わせを説明する。
tr -d '\0'
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
を 3 個の文字としてではなく、‘a’…‘x’
という文字の範囲として解釈することになるからだ。
この問題を解決する方法の一つは、ハイフンを文字のリストの最後に置くことである。
tr -d axM-
あるいは、‘--’ を使って、オプション処理はここで終わりと明示することもできる。
tr -d -- -axM
より普遍的な方法は、等価クラスの記法 [=c=]
を、‘c’ を ‘-’ で
(あるいは、他の任意の文字で) 置き換えて使うことである。
tr -d '[=-=]axM'
上記の例では、角カッコがシェルによって解釈されないように、 シングルクォートを使っていることに注意していただきたい。