レベル: 初級 Jacek Artymiak (jacek@artymiak.com), Freelance author and consultant
2003年 3月 12日 これまでsedが簡単だと言った人はいません。実際、簡単ではありません。しかし、sedの一番基本的な機能の多くは、trを使えば、非常に簡単に手に入れることができます。Jacek Artymiakが、その方法を紹介してくれます。
trは、sedの (非常に) 簡略化されたバージョンだと考えることができます。ある文字を別の文字に置き換えるとか、いくつかの文字の集まりを削除するといったことを行います。あるいは、文字の繰り返しを削除するのにも使うことができます。trができるのは、だいたいそれだけです。
では、なぜsedの代わりにtrを使うのでしょうか。もちろん、仕事が簡単になるようにです。たとえば、文字aの出てくる箇所をすべて文字zで置き換えたい場合、tr a z とすればよく、間違いなくsed -e s/a/z/g よりも簡単です。とくに、スクリプトの中で使用する場合、後者は、引用エスケープを行うのが非常に面倒です。また、trでは、やっかいな正規表現を記述せずに済みます。
trの使い方は簡単です。ある文字の出てくる箇所をすべて別の文字に置き換えたいときは、上で示した書き方をします。複数個の文字を置き換える必要があるときには、trabc xyz のような書き方をします。この場合、文字aの出現箇所はすべて文字xで、文字bは 文字yで、文字cは文字zで置き換えます。この2つのグループに指定される文字の数は、同じでなくてもかまいません。
文字の範囲を指定することもできます。たとえば、tr a-z A-Z とすると、小文字を、すべて、対応する大文字に置き換えることになります (たとえば、no smokingはNO SMOKINGに変換されます)。viエディターで編集中のテキストの特定の部分を強調したいときに、この変換は便利です。エスケープ・キーを押し、: を押して2,4!tr 'a-z' 'A-Z' とタイプしてリターン・キーを押します。すると、第2行目から第4行目までが大文字に変換されます。
|
trのもっと詳しいことについては
GNUのマニュアルには、trが、指定された操作を実行しながら標準入力を標準出力にコピーすることで、「文字の変換、圧縮、削除」を行うためのものであると書かれています。この記事では、こうした指定の仕方を紹介しているわけですが、trのmanページやinfoページをたどっていくと、もっといろいろなことを知ることができます。
新しい端末ウィンドウをオープンし、man tr またはinfo tr とタイプするか、新しいブラウザー・ウィンドウをオープンし、gnu.orgのtrのmanページを参照してください (リンク先は、参考文献 参照)。
|
|
Mac OSマシンやDOS/Windowsマシンで作成されたテキスト・ファイルが送られてきたときにも、trは非常に役に立つことと思います。行末にUNIXのニューラインが使われていない場合、ファイルをUNIXネイティブなフォーマットに変換する必要があります。そうしないと、コマンド・ユーティリティーの中には、そうしたファイルを正しく処理しないものがあります。Mac OSは、キャリッジ・リターンで行を終端しますが、テキスト処理ツールの多くは、そのようなファイルを1行として扱います。これを解決するには、以下の変換を行います。
- Mac -> UNIX:
tr '\r' '\n' < macfile > unixfile
- UNIX -> Mac:
tr '\n' '\r' < unixfile > macfile
MicrosoftのDOS/Windowsでは、キャリッジ・リターンにニューラインを続けたものでテキストの各行を終端するという約束になっています。これを解決するには、以下のコマンドを使います。
- DOS -> UNIX:
tr -d '\r' < dosfile > unixfile
- UNIX -> DOS: この場合、trでは、1文字を2文字に置き換えることができませんので、
awk を利用する必要があります。awk '{ print $0"\r" }' < unixfile > dosfile というコマンドを使います。
trが必要な場面としては、テキスト・ファイルに簡単な清掃処理を施す必要があるときというのもあります。たとえば、tr -d '\t' でタブを除去したり、tr -s ' ' で不要なスペースを除去したり、tr -d '\n' で複数の行を1行に結合するというような場合です。こうしたコマンドもviの中で利用することができます。それには、まず処理したい行の範囲を指定し、その後に感嘆符 (!) を添え、その後にコマンドを指定します。たとえば、1,$!tr -d '\t' という具合です (ドル記号は最後の行を表す)。
質問やご意見のある方は、ぜひお聞かせください。jacek@artymiak.com までメールをいただければ幸いです。
次回は、uniq を取り上げる予定です。それでは、また。
参考文献
著者について | | | Jacek Artymiakは、フリーランスのコンサルタント兼開発者兼ライターです。1991以来、UNIXおよびBSDオペレーティング・システムの数多くの商品版やフリーウェア版 (AIX、HP-UX、IRIX、Solaris、Linux、FreeBSD、NetBSD、OpenBSDなど) 向け、並びにMS-DOS、Microsoft Windows、Mac OS、Mac OS X向けに、ソフトウェアを開発してきています。Jacekの専門は、ビジネス・金融アプリケーションの開発、Web設計、ネットワーク・セキュリティー、コンピューター・グラフィックス、アニメーション、マルチメディアです。技術に関する執筆も数多く行っており、Install, Configure, and Customize Slackware Linux (Prima Tech、2000年) やStarOffice for Linux Bible (IDG Books、2000年) の共著者でもあります。Jacekのソフトウェア・プロジェクトの多くは、SourceForge で紹介されています。その他、彼のことについては個人的なWebサイト でも紹介されています。彼のメール・アドレスはjacek@artymiak.com です。 |
記事の評価
|