#初めに
実務で使ったコマンドの使い方を備忘録的にまとめます。
基本的な使い方は色んな方が書かれているので簡単に、
使っていて気付いた部分を重視して記述します。
実際の動きを見た推測等を含むため、仕様的に間違いがありましたら教えていただけると幸いです。
#trコマンドとは
文字を置換したり、削除したりできるコマンドです。
#置換してみる
$ echo lion | tr lion bear
bear
echoコマンドで出力される「lion」が「bear」に置換されています。
trコマンドの特徴は、文字自体を指定しているという点です。
文字自体を置き換えているので、今回の場合では、
l i o n
↓ ↓ ↓ ↓
b e a r
というように文字一つ一つが置き換わっています。
ですので、重複している文字があると期待した結果が得られないかもしれません。
$ echo deer | tr deer lion
loon
出力結果を見て分かる通り、「lion」に置換されていません。
今回の場合ですと、
「d」を「l」に
「e」を「i」に
「e」を「o」に
「r」を「n」に
という順番で認識され、途中で「e」の置換内容が書き換わってしまってしまうためこのような結果になります。
このことから、どの文字を何に変換するか先に全部決めてから、置換が走るようなプロセスになっていると思われます。
d e e r
↓ ↓ ↓ ↓
l o o n
#削除してみる
文字を削除する場合はオプションの「-d」を指定します。
$ echo l-i-o-n | tr -d '-'
lion
しっかり「-」が削除されています。
削除する文字を複数指定することもできます。
$ echo l-i-o-n | tr -d 'oi-'
ln
#ここが書きたかった!!
コマンドの備忘録ということで基本的な動きの確認は必要でしたが、本当に書きたかったのはここからです。
実はこの記事は以前に書いたprintfコマンドの続きです。
【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】
一時期ハイフンを量産したり消したりを執拗に迫られていてその時に気付いたのですが、
先述したtrコマンドで文字を複数消す場合に、例えばこんな感じ
$ echo l-i-o-n | tr -d "-oi"
tr: invalid option -- 'o'
ハイフンを一番前にしてしまうと、「""」で囲んでもオプションとして認識されエラーになってしまいます。
他の文字とともにハイフンを扱う場合は、指定文字の最後にハイフンをつけるのがお作法なのでしょうか。
printfコマンドの記事でも記述しましたが、ハイフンをエスケープしてあげることでエラーを回避することができます。
$ echo l-i-o-n | tr -d -- "-oi"
ln
エラーも出ず、一安心ですね。
ハイフンを真ん中に入れてみると。。。?
$ echo l-i-o-n | tr -d -- "o-i"
tr: range-endpoints of 'o-i' are in reverse collating sequence order
怒られてしまいました。そんなレンジはないとのことです。
どういうことかというと、trコマンドは範囲でも文字の指定をできます。
つまりこの場合、アルファベットの範囲を指定したことになりますが、「o」は「i」より順番が後ろですのでこのような範囲指定はできないようです。
同様に、数字の範囲を指定する場合も「0-9」ではなく、「9-0」と指定するとエラーが出ます。
では正しい使い方で指定すると
$ echo l-i-o-n | tr -d -- "i-o"
---
「l」も「n」も「i-o」の間にあるので、しっかりアルファベットの範囲で「i-o」の文字が削除されているのが確認できます。
ここで注意してもらいたいのが、ハイフンをエスケープしても範囲指定のハイフンが優先されていることです。
先頭に付けるとエスケープしなければオプションと間違えられ、
真ん中に付けると範囲指定として認識される。
やはり他の文字とハイフンを併用する場合は、ハイフンは最後に付けるのがお作法としてよさそうです。
#まとめ
trコマンドを色々動かしてみました。
ただ動きを確認するだけだったのに、たまたまハイフンを使ったせいで大変な目にあいました。