2008年03月13日
川俣晶の縁側ソフトウェアその他開発日誌 total 4026 count

NT版UNIX-like toolsのtrコマンドでダブルクオートや円記号を置換する方法

Written By: 川俣 晶連絡先

 悩ましい質問が来て調査したので、結果をメモしておきます。

お断り §

 本文中で円記号として表記している文字は本文中でバックスラッシュ記号として表示されているかもしれません。しかし、両者は同一の文字です。COPY&PASTEして動作するように、見た目上も円記号になるようにU+00A5(¥)という文字を使って記述はしていません。

問題 §

 NT版UNIX-like toolsのtrコマンドは標準入力に含まれる特定の文字を別の文字に置換することができます。

 置換する文字は、コマンドライン引数で指定します。(ただし拡張された引数展開機能があるので、間接的な指定はあり)

 このとき、ダブルクオートや円記号を直接記述できない問題があります。

 ここで、拡張された引数展開機能に含まれる「次の1文字をエスケープしてありのままの文字として扱う」という'文字を使用し、tr '" Xやtr '/ Xというコマンドは正常に動作しません。引数解析アルゴリズムの関係上、前者は"によるエスケープの解釈と絡まって誤動作し、後者は記述された円記号が更にエスケープの起動トリガとして認識されるため、円記号とは解釈されません。

解決 §

 これらの特殊文字は、円記号によるエスケープ+8進コードを使って記述することで指定できます。これが最も安全な指定方法だと思われるので、これを暫定的に推奨しておきます。

  • ダブルクオートの置換 tr \042 X
  • 円記号の置換 tr \134 X

感想 §

 他人の書いたコード、それも効率的にコンパクトに記述されたCソースを読むのは大変だ!

 しかし、ソースコードは嘘をつかない! 混濁した人間世界と違って、真実は1つ!

 その点はとても心地よいぞ!