一致しますし、、、 $ " は文字列の最後に位置する空文字列 に続けてユーザー名を指定し ム・ディレクトリを、 に一致します。文字、、 . " は任意の 1 文字に一致します。 た場合にはそのユーザーのホーム・ディレクトリを表し ます。ホーム・ディレクトリの下にいない場合や、ディレ ちょっと変わった拡張として、以前一致した文字列に クトリ階層の奥底で作業をしているときにホーム・ディ 再度一致する記法も準備されています。これは、、、 \ 数 レクトリに存在するファイルを参照する場合などには、 字 " という形態で用いるもので、その数字番目の部分正 たいべん便利な機能です。 規表現に一致した文字列と一致します。例を示しましょ う。 \ ( [ab] \ ハ 1 という正規表現では、ます最初の部分 UNIX での基本正規表現 正規表現 ( \ ( [ab] \ ) ) で、 a もしくは b と一致し ます。次の数字の部分では、 1 番目の部分正規表現で一 今度は、本物の正規表現の話です。ます、 ed コマン 致した文字列と一致しますので、、、 a " に一致していた場 ド、 sed コマンド、ⅵコマンドや grep コマンドなどで 合にはここでも、、 a " と、、、 b " に一致していた場合にはこ 用いられている基本的な正規表現からです。 こでも、、 b " と一致します。したがって、この正規表現 は、、 aa" もしくは、、 bb" と一致します。部分正規表現の UNIX の基本正規表現は、さきはど紹介した正規表 数え方ですが、全体の正規表現のなかの開き括弧 ( \ ( ) 現とよく似ています。ただし、大きな違いとして選択の を左から数えた順番です。 \ ( \ ( [ab]\)\2\)*\1 という 演算は準備されていません。演算は、連結、糸区し、グ 正規表現では、 \ 2 は \([ab]\) で一致したものを示し、 ルーフ。化の 3 つです。グルーフイヒでは普通の括弧ではな 前にバックスラッシュを付けた、、 \ ( " と、、 \ ) " を用 Ⅵは \(\([ab]\)\2\) で一致したものを示します。 います。 UNIX での拡張正規表現 基本的な正規表現を用いてはいますが、繰返しの回 数指定は利用できます。この場合も普通の中括弧では egrep コマンドや awk コマンドなどは、基本正規表 なく前にバックスラッシュを付けた、、 \ { " と、、 \ } " を用 現にいくっかの拡張を施した拡張正規表現を用いていま います。回数の指定では、数字を 1 つだけ使って繰返 す仙肄 i のⅵコマンドも拡張正規表現を扱えます ) 。今 しの回数を指定する方法 (\(ab\)\{3\}) 、数字とカン 度は、この拡張正規表現をとりあげましよう。 マを用いて指定した回数以上の繰返しを指定する方法 UNIX の拡張正規表現では、尺、連結、縄区し、グ (\(ab\)\{2,\}) 、 2 つの数字をカンマで区切って区 ルーフイヒのそれぞれの演算を利用できます。選択は、通 し回数の範囲を指定する方法 (\(ab\)\{3,5\}) の 3 常の正規表現と同様に、、にで表します。選択の対象とな 通りを利用することができます。 る正規表現は空ではいけません。連結を正規表現を並べ これ以外に、空文字列を表す場合に、、 \ ( \ ) " を用いる ることで表現するのも通常の正規表現と同様です。 点などか挙げられますが、選択の演算がないため、これ * + ? に加えて、 UNIX を用いることはますないでしよう。 繰返しに関しては、 の基本正規表現でも用いた回旨定ができます。回旨 文字を指定する部分では、シェルに存在したのと同様 、、 \ { " ではなく、 { を用います。 定には、 の、、 [ ] " を用いた 1 文字の選択演算をおこなうことがで グルーフイヒでも、、 \ ( " ではなく、たんなる、、 ( " を用い きます。この場合、シェルと同様に、、 [ ] " のなかに一致 ます。また、空文字列の表現は、、 ( ) " となります。選択 させたい文字の並びを指定します。この部分では、たん の演算子を用いる場合、たとえば、、 (labc ) " などのよう に文字を指定するだけではなく、文字の範囲を指定でき につい空文字列としてなにもない正規表現を指定してし ることも同様です。また、 [ の直後に を記して まいがちです。しかし、これは誤りです。空文字列を指 おけば、指定した文字と一致しない文字を指定すること 定する場合には、かならず、、 ( ( 刃 abc ) " など、括弧を明 もできます。これは、たとえばに 0 ー 9a ー z ] とすると、数 字でもアルファベットの小文字でもない文字のすべてに 己してください。 一致します。 UNIX の拡張正規表現においても、、 [ ] " を用いた 1 文 たんに文字としていた正規表現の要素も若干拡張され 字の〕尺をおこなうことができます。これは、 UNIX の " は、文字列の先頭に位置する空文字列に ています。 基本正規表現におけるものとまったく同様な記述が可能 144 UNIX MAGAZINE 1996 ユ 0 一三ロ
、、 a " て始まり任意の文字列か読く文字列 例 : a 、 ab 、 abcdef 、 aaaaaa など z で終る文字列 例 : z 、 xyz 、 zzzzzzz など 数字だけで構成される文字列 例 : 12 、 56789 、 777 など ( と ) で囲まれた文字列 例 : (a) 、 ( 123 ) など といった、さまざまなものを表現することができます。 しかし、正規表現では表現できないものも存在します。 たとえば、 ( と ) の対応がとれた数式 は表現できません。 括弧で囲まれた文字列は表現できるのに、括弧の対 応はとれないというとおかしく聞こえるかもしれません が、この 2 つには大きな違いがあります。前者は括弧の 数は 1 組と限られていますが、後者では括弧の数か決め られていません。正規表現では、数をかぞえる場合には 決められた数しかかぞえることができません。 このように正規表現には制限はあるものの、簡単に文 字列の集合を表現できるために、さまざまな局面で用い られています。たとえは、 UNIX のシェルでは、ファイ ル名を簡単に指定するためにこの正規表現 ( のようなも の ) を用いています。 DZ—X 流プログラミング 今泉貴史 正規表現の基本 前回までは、ネットワークを利用するためのさまざま 舌を進める前に、基本的な正規表現について紹介して な方法や、それらを利用した伊題プログラムなどを紹介 おきましよう。基本的な正規表現では、「選択」「連結」 してきました。ネットワーク・プログラミングに関して、 「系区し」「グルーフィ匕の 4 つの演算を用います。これ すこしは、、できそうだな " と思っていただけたでしよう らと、実際に使われる「文字」を組み合わせることで、 正規表現を構成します。 今回は、言語の処理系を作成する場合などに有効な ここでいう「文字」とは、 a 、 b 、 c や 0 、 1 、 2 など、 システムを紹介しようと思ったのですが、その前に 正規表現で表す文字列で実際に用いられるそれぞれの文 UNIX のさまざまなコマンドで用いられている正規表 字です。もっとも簡単な正規表現 a" は、、、 a " という 1 現をとりあげます。 文字から構成される文字列を表現します。 演算子のなかで、もっとも簡単なものは「連結」で 正規表現とは す。これは、たんに対象となる正規表現を並べて書く もので、、、 ab' という正規表現は、文字、、 a " の後ろに文 字、、 b " か読くもの、つまり、、 ab " という文字列を表しま す。この「連結」では、いくつもの文字 ( 正確には正規 UNIX MAGAZINE 1996.10 1 一 1 一口 正規表現は、いくつかの文字列を一度に指定するため の方法の 1 つです。正規表現を用いると、 138
LJN Ⅸ流プログラミング 72 すことができます。この正規表現は、、、空文字列、 ab 、 abcde ' は正 表現 ) を続けることもできます。つまり、 、、 abcde" という 5 文字の文字列を表し ます。 規表現であり、 うちの 1 文字から構成される文字列を表現することにな 引 b lc " なども正規表現であり、 a から e までの いても複数の正規表現を選択肢とすることができます。 文字列か、、 b " という文字列を表します。「選択」にお a という す。たとえば、 引 b" は正規表現であり、 するというものです。演算子としては一を用いま 「選択」は、 2 つの選択肢のうちのいすれかを選択 ります。 UNIX MAGAZINE 1996.10 (ab)*" と表 たとえば、さきほどの、、 ab " の系お医しは、 現を括弧でくくれば、グループとすることができます。 備されています。ひとまとまりとして扱いたい正規表 でしよう。このために、「グループイ匕という演算か準 では、 、、 ab " の系区しを表現するにはどうしたらよい に一致するはすであると考えれは分かるでしよう。 先順位が高いのであれば、、空文字列、 aa 、 aaaa 、 順位が高くなっています。これは、もし連結のはうが優 が、「連結」と「繰返し」では、「系お区し」のはうが優先 ることで、察しのよい方は気がついたかもしれません a の 1 回以 . E の縄区しを指定するために、、 aa*' とす aa*" とする必要があります。 定する場合には、 a の 1 回以上の区しを指 る点に注意してください。 " という文字列を表します。 0 回以上の区しであ ば a*" という正規表現は、、、空文字列、 a 、 aa 、 aaa 、 回以 - ヒ、任意の回数繰り返すことを意味します。たとえ に、、 * " を付けて表します。これは、直前の正規表現を 0 次は「繰返し」です。繰返しは、正規表現の直後 を先に解釈してから選択をおこないます。 連結と選択では連結のはうが優頂位が高いため、連結 位が足し算よりも高いためです。正規表現の場合には、 してから足し算を実行します。これは、掛け算の優先順 算 (x) と足し算 ( 十 ) が交しっているときには掛け算を うか。しつは小学オ交の算数でもやっていることで、掛け と、、 cd" を表します。演算子の優先順位をご存しでしょ の 2 つが考えられますが、答は後者、つまり、、 ab" 、、 ab" と、、 cd' ・、 abd" と、、 acd' ablcd " はどのような文字列を表すのでしようか。 「連結」と「選択」を組み合わせた場合、たとえは、 abab 、 BNF " といった文字列を表します。 さて、皆さんは BNF (Backus-Naur Form もしく は Backus-Normal Form) と呼ばれるものをご存しで しようか。これは、特定の言語の文法を表現するのによ く用いられる方式です。たとえば足し算と掛け算と括弧 から構成される簡単な数式の文法を表現するのに、 → → → → → E 十 T T x F (E) とします ( れは任意の整数を意味します ) 。ちなみに BNF の表現方法にはイ研重類かあり、 ここで用いるのは 正式な BNF とは異なるものですが、この違いは些細な ので、とくに間題となることはないでしよう。 それぞれの行は構文 ( 書換え ) 規則と呼ばれます。 の文法で大文字で書かれている、書換え規則の左辺に出 現するものは非終端記号と呼はれ、文字の集合を表して います。大文字以外で書かれているものは終端記号と呼 はれ、その記号が示す文字 ( 十ならば十という文字 ) を 表します。この BNF では、 E という記号が E 十 T とい う記号列に書き換えられることを示しています。ちなみ に、左辺に E という記号をもつ規則はもう 1 つありま す。 E という記号の書換えが必要になった場合には、 の 2 つの規則のどちらかを適宜適用して書換えをおこな います。どちらを適用するかを決める作業は構文解析な どと呼ばまた別の作業になりますが、 こでは詳細 は説明しません。 これだけではちょっと分かりづらいかもしれません。 例を使って説明しましよう。 2 十 3 x 4 という数式をこ の文法を使って記号 E から書き換えてみましよう。 139 2 十 E x F 2 十 T x F 2 十 T E 十 T 工十 T E 十 T
連載 / プログラマー入門ーの リスト 3 public import import lmport Observer/Observable をしたデジタル畤計のソース 」 ava ・ applet . * ; 」 ava. ut 土 1. * ; java. awt . *; class CIock2 extends App1et implements Observer Tick tick = nu11; String datestr = nu11 ; public void init ( ) setFont (new Font (getFont ( ) . getName ( ) , public void start() Font . BOLD, 24 ) ) ; tick tick tick public new Tick( (Observer)this) ; . start() ; public void stop() ・ stop(); tick = nu11; VOid update (ObservabIe if (datestr ! = Ⅱ u11 ) { public void paint(Graphics g) repaint() ; datestr (String)arg; 0 , Object arg) g. drawString(datestr,50, 100 ) ; ・ EOF ( ファイルの最御 ・ EOL ( 行末 ) 数字列 ・文字列 されるたびに、ストリームの文字の列から、 StreamTokenizer は、 nextToken() メソッドかま行 UNIX MAGAZINE 1996.10 ・文字列の文字 き出したりすることカそきます。さらに、 キップしたり、引用文字で囲まれた部分を文字列として抜 を抜き出します。また、設定に従って、コメント部分をス class Tick extends ObservabIe implements RunnabIe { Thread thr public Tick (Observer obsv) / / 通知先の Obse て ver を登録する addObserver (obsv) ; = null ; public void start ( ) if (thr = = Ⅱ u11 ) { thr = new Thread(this) ; thr. start(); public void run() while (thr ! = Ⅱ u11 ) { try { Thread. sleep ( 1000 ) ; } catch (InterruptedException e) { / / 状態が変化したことを記録する setChanged() ; Tokenizer を利用して、設定ファイルを読み込むプログ をプログラムで設定することもできます。この Stream- ・コメント文字 ・引用文字 ・空白文字 数列の文字 thr = Ⅱ u11 ; public void stop() notifyObservers(datestr. substring()l , 19 ) ) ; / / 現在時刻を表す文字列とともに Obse て ver へ通知する String datestr = d. t0String() ; Date d = new Date(); ・フォントサイズ ・フォント名 正ファイルは 1 行からなり、 ラムを作ってみましよう。 99
です。、、一 " を利用した範囲の指定や、 " を用いた範囲 の反転機能も有効です。拡張正規表現では、 abc のなか から 1 文字を選択するためには、、 ( 引 blc ) " と、、 [abc]' のいすれも可能です。 こで 1 つ注意が必要です。 UNIX の基本正規 表現で可能だった、以前一致した文字列に再度一致 するという記法は利用できません。 \([ab]\)cde\l という UNIX 基本正規表現に対応する正規表現は、 (acdealbcdeb)" となります。しかし、この、、 \ 1 " と いう記法は、正確にいえば正規表現ではないので 4 、 \(\([ab]\)\2\)*\1 というさきほど示した例題を UNIX の拡張正規表現で記述することはできません。 コマンドでの拡張 UNIX にみられる正規表現は、ここで述べるような基 本的な性質をもっています。しかし、実際にコマンドの なかで用いられるときには、それぞれ拡張がおこなわれ こで述べただけの機能ではありません。 ていて、 たとえば拡張正規表現を用いる egrep では、基本正規 表現で利用可能だった以前一致した文字列に再度一致す るという記法を利用することができます。しつはこの仕 組みは、正規文法では記述できません。正規文法よりも 記述能力の高い文脈自由文法 ( 今回 BNF の例として記 述した式の文法は文脈自由文法です ) でも記述すること ができません。これらよりも能力の高い ( しかも分かり にくい ) 文脈依存文法という文法を利用する必要があり ます。この文法はかなり難解ですが、このように特定の 目的にだけ使うのであれば同じ効果を簡単に得ることが できます。 また、エデイタなどでたんに検索をおこなうだけでな く置換もおこなう場合には、同様な記法を用いてすでに 存在する文字列を置換できます。ⅵなどでは、 という記法を用いれば、 12 : 34 という文字列を、 34 : 12 4 、 UNIX の " 正規表現にはありましたが、標準の正規表現ではないの UNIX MAGAZINE 1996 ユ 0 IJN Ⅸ流プログラミング 72 に置換できます。置換においては、これ以外にも一致し たすべての文字列を表す、、 & " や、一致した文字列を大 文字や小文字に変換してしまう記法など、さまざまなも のか準備されています。実際に利用するコマンドのマニ ュアルを参照してください。 正規表現を指定する場合にも、複数の文字を一度に 指定する略記法カ備されているものが多くあります。 、 [ 0 ー 9 ] " を表現するために、、 \ d " や、、 [[:digit:]]" な どといった記法を用いることができるコマンドもありま す。ほかにも、単語の区切りの空文字列に一致する記法 など、便利な記法か準備されています。使用するコマン ドのマニュアルを参照してみてください。 ☆ 今回は、いくつかの文字列を一度に指定するための方 法として、 UNIX でよく用いられている正規表現につ いて紹介しました。正規表現を用いるコマンドは多くあ りますが、コマンドごとに若干違っていることもあり 「これだ」という説明はなかなか難しいのですが、今回 は UNIX の基本正規表現と UNIX の拡張正規表現の 2 不鶤頁を紹介しました。基本正規表現は、以前は ed の オンライン・マニュアルで紹介されていたもので、各種 のコマンドがこの正規表現をもとにしています。 egrep コマンドではその正規表現が拡張されたのですが、丘 は POSIX 1003.2 により正規表現が規定されているた め、今回はそこで紹介されているものをもとに説明しま した。また、正規表現と関係の深い正規文法、正規文法 の紹介のために、 BNF による文法の記述方法なども紹 介しました。これらは次回以降の説明で必要になってく る知識です。今回はかなり難しくなってしまいました。 自分の専門に近い分野なので簡単に説明できるかと思っ たのですが、かえって難しいですね。 次回は、冒頭で紹介したように自分で言語を新たに設 計するときに便利なシステムについて紹介します。この システムは今回紹介した正規表現を用いているため、今 回はそこから解説をしました。次回とりあげるのは lex というシステムで、文字列の並びのなかから言語の予約 語などを取り出すためのものです。このシステムと yacc と呼ばれるシステムを組み合わせると言語解析ができま す。 yacc システムに関しては、 lex のあとで紹介する予 定です。 145 ( いまいすみ・たかし東京工業大学 )
NEWS FAX のイメージデータに、データを書き ズ」 OS/2 対応版の販売を開始した。動作 価格は 5 , 980 円。 環境は OS/2 Warp V3. OJ 。 加えて返信するソフトウェア「返信ジョー •ND リモートアクセス・サーバー ポートは RS232C 規格の DB25 ( メス・ ネットワークダイナミックス (Tel 03 ー コネクタ ) で、 115.2Kbps 。 I/F は IOBase 3366 ー 1521 ) は、米 Lantronix のリモート 「 LRSI 」の販売を開 T ( RJ ー 45 コネクタ ) 。 SNMP によるネッ アクセス・サー 始した。 トワーク管理機能がある。 GUI べースの モデムを介して遠隔地の TCP/IP 、 ユーティリティ・ソフトウェア EZCon が cm 、重量は 1.2kg 。 添付。 IPX ネットワークに接続できる。 PPP 、 価格は 125 , 000 円。年間販売目標は SLIP/CSLIP をサポート。 外形寸法 ( HxWxD ) は 2.5X11X15 500 台。 中。オムロン、アイワなどのモデムにもバ ンドル。今後、 PC にもバンドルを予定。 インターネント無料接続サービス 現在、オリジナル番組「 Weekly Net アスキー (Tel 03 ー 5352 ー 1610 ) は、 6 月 同社の有料サービスの 2 倍以上。サービ Cruise 」「 C001 Challenge 」などを提供。 19 日より開始した無料接続サーピス「ア スに関する問合せ件数は、 1 日平均 300 件 旅行、不動産、アイドル情報などの番組 スキー・インターネットフリーウェイ」の 前彳麦。 も企画中。 登録会員数が、サーピス開始後 1 カ月で 専用の接続ソフトウェア「 Hot Cafe 」 URL は、 http:/ / www.aif.or.jp/、 30 , 000 人を突破したと発表した。 は、ホームページからのダウンロードのほ http://www.asciinet.or.jp/o 利用時間は 1 人 1 回あたり平均 24 分で、 か、都内の主要 PC ショップで無料配布 ・ ASCII •NUC ジンを用意。 対応 OS は、 Windows NT 3.51 のは WWW 対応全文検索フログラム かに、 SoIaris 2. x 、 SunOS 4.1. x 、 HP— 索し、見出しの自動検出が可能。制約の UX 10. x 、 EWS (OCMP 対応 ) 、 NEWS 日本ユニソフト (Tel 03 ー 3664 ー 5470 ) ないフリーワード検索、文字コードの自 は、 WWW 対応の全文検索プログラム (OCMP 対応 ) など。 動判別、大文字・小文字などを同一視し 「 Co. Co. Da for Web 」 Windows NT 対 価格は 500 , 000 円。 た検索が可能。検索実行用 HTML テン 応版の販売を開始した。 テキストファイルを自動的に選択・検 プレート、 CGI または各種 API 対応工ン ■ R ℃ OH ! ⅱ日 音声認識 LSI 第や A RL53840 $GD OC おもな特徴は以下のとおり。 リコー (Tel 045 ー 477 ー 1702 ) は、ワー ド・スポッティング機能を 1 チップ上に 1 ) 不特定話者認識と特定話者認識の両方 実現した、音声認識 LSI 「 RL5S840 」の に対応 サンプル出荷を開始した。 2 ) 音声認識部、マイクアンプ、 A/D コン ワード・スポッティング機能とは、「え バータ、辞書用メモリを内蔵 、ストップかな」といった不要な言葉 3 ) I/F は 8bit パラレル を含む発声から、必要な単語第ストップク 4 ) 耐騒音性を備え、ノイズを含む音声の だけを抽出して認識するもの。 認識が可能 UNIX MAGAZINE 1996.10 i ⅱ " i いい i いリ サンプル価格は 5 , 000 円。量産開始は 1997 年 2 月。当初の月間販売目標は 10 , 000 個言 15
連載 / プログラマー入門ーの 表 4 StreamTokenizer クラスのおもなメソッド ー HotJava(tm) B 「 0 e 「 1. ロ preBetaåA U 日し ~ ノ兀 lock3 File Edit Vlew Places 図 3 フォントを変更した時計 whitesp aceChars ( lo 囮 , ん朝ん ) wordChars ( あん朝ん ) quoteChar (ch) commentChar (ch) ordinaryChar (ch) nextToken() StreamTokenizer (stream) メソッド式 文字あから文字ん朝んのあいだの文字を空白文字とする 文字んから文字ん朝んのあいだの文字を文字列の文字とする 文字 ch を引用文字とする 文字 c んをコメント文字とする 文字 c んがもっ特別な未をクリアする ストリームの次のトークンを返し、文字列と直を sval 変数と nval 変数に設定 入力ストリーム stream 用の StreamTokenizer オプジェクトの生成 メソッド皀 カレントの行番号を返す HeIp 08 : 50 : 31 A 叩は started. ・フォントスタイル ソースコードには FileInputStream クラスも出現 ください。 参考にしながら、 StreamTokenizer の使い方を理解して ました。この表とリスト 4 のソースコードのコメント文を 表 4 に、 StreamTokenizer のおもなメソッドを列挙し たデジタル日てす。 イタリック体です。また、図 3 はこのフォントで表示し ントサイズは 24 ポイント、フォントスタイルはポールド・ です。この例では Times New Roman フォントで、フォ Times New Roman : 24 : ITALIC : BOLD : 設定ファイルの言己西列は、 け並べることにします。 の指定は、、、 BOLD ITALIC PLAIN" を必要なだ 区切って並べた形式とします。ただし、フォントスタイル の各項目を、 UNIX の passwd ファイルのように : で 100 していますが、このクラスは指定されたファイルの内容を ストリームですクラスです。 C 言語でいえば、ファイル を言ムみ専用でオープンして、 read() 、 close() するのと 同しようなものです。 ディレクトリとファイル ファイルの話が出たところで、ファイルとディレクト リの操作について紹介しましよう。 通常、 UNIX のシェル上でおこなっているような、 ・ ls ( ステータスの表示 ) ・ mkdir ( ディレクトリの作成 ) ・ mv ( 移動 ) ・ rm ( 削除 ) などの操作と同等のことが、 Java. io パッケージの FiIe クラスを使って見できます。 表 5 に、 FiIe クラスのおもなメソッドを列挙しました。 メソッド名を見れば、各メソッドの働きは一目瞭然です リスト 5 は、 FiIe クラスを利用して /tmp ディレクト リの下のファイル名を表小するプログラムです。ディレク トリに対応する FiIe オプジェクトで、 Fi1e オプジェクト . 1 土 st ( ) を実行すると、すべてのファイル名を文字列の配列として 返してくれます。これを画面に表示すれば、あっという間 に WWW ページ上で簡易版 ls コマンドかま現できまし た。図 4 はこのプログラムの実行結果です。 UNIX MAGAZINE 1996.10
という正規表現が得られます。この正規表現は、 a が偶 固で b が奇数個のすべての文字列を表しています。 文法を作成するのに慣れないあいだは、このような 文法を作成できること自体が信しられないかもしれませ ん。しかし、慣れてくればこの程度の文法ならすぐに作 れるようになるはすです。ただし、正規表現のはうはそ う簡単にはいきません。この程度の文字列であっても、 正規表現で表すとさきほどの例のようにかなり長くなっ てしまうのです 2 。 今回、正規表現の説明をするにあたって、あえて正規 文法の説明をしたのはこのためです。正規表現でうまく 表現できない間題に当たったときには、正規文法で記述 してから正規表現に変換するという手法をとると解決で きる場合も多いと思います。 シェルのメタキャラクタ UNIX においては、正規表現はさまざまな場所で使 われています。もっとも頻繁に用いられるのは、ファイ ルから文字列を検索するための grep や egrep コマンド でしようか。これ以外にも、エデイタでの検索、 sed や awk でのパターンマッチなどに使われています。また、 厳密には正規表現とはちょっと異なりますが、シェルで パス名を指定するためのメタキャラクタなども、よく似 た性質をもっています。 シェルのメタキャラクタでは、おもに、、 ? " と、、 * " が 用いられます。、、 ? " は、任意の 1 文字に一致します。正 ( 引 b lc に といったところでしようか。 規表現で表せば、さしずめ、 的に短くなることはないでしよう。正規表現の定義からは、はかにも 2 正規表現の性質を使えはもっと短い表現も考えられるでしようが、劇 は、、 ? " とは一致しないようになっています。 いるためです。この常識に合わせ、先頭のピリオドだけ イルは、通常の操作では気にしなくてすむようになって れは、各種設定ファイルなどのふだんは必要のないファ が、、 . " て始まるファイルはそのままでは見えません。 依存しています。ご存しのように、 ls コマンドでは先頭 致しなくなるのです。これは、 UNIX の常識に大きく はんのすこし異なります。 " ( ピリオド ) にだけは一 ただし、この文字が先頭に用いられた場合には意味が 数多くの質か導き出せるのですが、 ん。 142 こでは言岩田については触れませ もう 1 つのメタキャラクタである * は、正規表現 を使うと、、 ? ′という意味になります。ここでの ? は メタキャラクタで、、、 * " は正規表現の演算子です。つま り、任意の文字の 0 文字以の区しを意味します。た だし、 ? と同様に先頭の場合にのみピリオドとは一致 しません。このために、たんに * と指定すると、カレ ント・ディレクトリに存在するすべてのファイル ( 先頭 がピリオドで始まるものを除く ) を指定したことになり ます。 シェルのファイル名の置換で用いられる記号に、もう 1 つ [ ] で文字列をくくるというものがあります。これ は、なかに含まれる文字列のそれぞれの文字のうちの 1 つを選択するという意味になります。つまり、 [ab c] という記法は、正規表現では、 と同し意味になります。 また、複数の文字をまとめて指定するための略記法も 準備されており、 [ 0 ー 9 ] は、 ( 幻幻引引引引引田 9 ) を指定したものとみなされます。この指定方法では、 ASCII コードの並び順がそのまま使われます 3 。文 字、 0 " は ASCII コードで 3016 で、文子 9 は 3916 で す。この間の文字コードをもつ文字すべてか指定された ものとみなされます。 文字コードでは、いわゆる全角の文字も考えなければ いけません。一部の UNIX では、ファイル名にも全角 文字が使えます。この場合、 ? が 1 文字に一致する場 合と、、 ? ? " が 1 文字に一致する場合が考えられますし、 全角の、、 ? " や、、 * " の扱いも難しいところです。また、 、、 [ ] " を使った並びで全角文字が使えるかどうかなど、い ろいろときわどい部分があります。これらに関しては、 お使いの UNIX のシェルのマニュアルで石寉認してくだ (alblc) 3 はとんどの場合は ASC Ⅱコードを使っていると思いますが、もしそ うでないコードを使っている場合には、そのコードでの並い屓に依存し ます。 UNIX MAGAZINE 1996.10
UN Ⅸへの招待⑩ I*IX MAGAZINE 下記の編集コマンドはそれそれ次のような働きをします。 c-d : カーソル上の 1 文字を削除する (N が肖える ) DEL : カーソルの直前の 1 文字を削除する ( U が肖える ) ところで、 Mule にはカーソル以外に、、ポイント " とい う概念があります。ポイントは、カーソルと同しように編 集位置を示すもので、、、カーソルの位置とその左にある文 字のあいだ " にあります ( ただし、目には見えません ) 。た りにポイントを使って説明してみましよう。 ーイ列として、前記のコマンドの機能をカーソルの代わ あります。 となっているとき、ポイントは、、あ " と、、や " のあいだに あ国 とえば、 148 ができてもよさそうな安仂ゞします。 は、そろそろカーソルをポイントの位置に表小するイ督はみ ば、 X ウインドウ・システムや Wind 。 ws 上の Mule で どということはできなかったのです。日罸にの流れからいえ のような端末では、文字のあいだにカーソルを表小するな とんどなく、文字しか表示できない端末が中心でした。 代には、現在のようなピットマップ・ディスプレイはは ろが、 Mule の親ともいえる Emacs が生まれた 1970 年 ソルとポイントの違いを説明するまでもありません。とこ まり文字と文字のあいだに表小するイはみがあれば、カー 余談になりますが、カーソルをポイントのある位置、つ ます。 ではとくに断わらないかぎり、編集位置をカーソルで示し ントの後ろの文字か消える " となります。なお、この記事 れを、、ポイント " という言葉を使って表現すると、、、ポイ c-d を入力するとカーソル上の文字肖えますが、 消える ) DEL : ポイントの前 ( 左燐 ) の 1 文字を削除する (U が 消える ) c-d : ポイントの後ろ ( 右隣 ) の 1 文字を削除する (N が カーソルコマンド C-p カーソル移動 ↑ → C-f ■ ↓ C-n C-b ← 図 1 UNIX MAGAZINE 1996 ユ 0 ー 0 昔々、とっても大昔、その森に 1 羽の年老いたペンギンがいま \ \ in that forest . Long long time ago , there was an 01d penguin\ その場合は、 行に折り返して表示されていることもあります。ただし、 もちろん、ウインドウの横皜に収まらない長い行が、次 では、続くテキストが次行の知頁に表示されています。 改行は目に見えません。しかし、改行コードがある場所 す。、、あ " という文字は画面に、、あ " と表示されますが、 MuIe では、改行コードも 1 つの文字として扱われま 改行も 1 文字 なども憶えておくと便利です。 このほか、行頭に移動する C-a 、行末に移動する C-e 1 も参考にしてください。 p は previous 、 n は next の略と憶えれば簡単です。図 (E) 、 C-n ( ーです。 b は backward 、 f は forward 、 と C-f ( 右 ) を使います。上下の行へは、それぞれ C-p カーソルを 1 文字すっ左右に移動けるには、 C-b ( 加 上下左右への移動 ます。 は Beginning of bu 仕 er " などのメッセージが出力され そのとき、エコー領域には、、 End of buffer" 、あるい に ) ベルカ鷦ってその旨を教えてくれるものもあります。 以ま錐めないときにキーを入力すると、 ()i と同しよう カーソル移動キーは各種ありますが、なかには、それ MuIe を起動してキーの働きを試しながら読み進めてくだ MuIe のカーソル移動キーを紹介します。できれば、
特集 せん。 消したものを戻す monkey : いろんな削除ガ去を説明してきた あつぶる . 忘れたい過去は消せませんでしたけど。 monkey : 消せたら便利やねんけどな。せやけど、それ ・ ( ぐーうっと遠い目 ) 。 を背負っていくのも人生かな・・ いやいや、本題は文字の削除やったな。いま説明した 機能は、ワープロではあんまり使わへんかもしれへんけ ど、 Mule やったらけっこう利用するで。 あつぶる . うまく使うとかなり効率よく編集作業ができ そうですれ monkey : そうやな。次は削除してしもたもんを、もう 1 夏活させる方法や。 あつぶる : へえ、そんなことかできるんですか。 monkey : 特定の方法で削除した文字は、復活させられ るんや。 あっぷる : 壊れた人間関係なんかも、それで復活させられ たらいいんですけどね ( 試すような目 ) 。 monkey : ごっつい残念やけど、それは無理な注文や。そ んなもんがあったらなあ。せやけど、それもいつかはえ え思い出になるはすや・・・・・・嘘ろな目 ) 。 図 12 を見てください。カーソルは 1 文字お尺してい るように見えますが、しつはカーソルのなかにさらにポイ ントがあると考えられます。マウスカーソルの矢印の : 頁 部分が hotpoint であるのと同様です。この部分を寉な 場所に合わせなければ、メニュー〕尺などの重川乍が正確に できません。それと同しように、 Mule のカーソルにもポ イントがあると思ってください。そのポイントの位置カ咽 の黒丸の部分です。 カーソル中のこの場所にポイントがあると考えると、範 囲指定が分かりやすくなります。つまり、 C-SPC てマー クカイ寸くのは、カーソルのある文字自体ではなく、その文 字の左 - ヒの部分なのです。 図 13 は、 fine の f にカーソルを合わせてマークを付け、 続いて true の t にカーソルを移動して C-w を入力した 例です。マークはカーソルの左上にあるわけですから、削 除範囲は改行も含めて、 "fine . . ls it " までとなりま す。これて硼窈旨定ガ去もすこし分かりやすくなったで しようか。 42 5 モーレッ UN Ⅸ あっぷる . ( あらまあ、突っつくとおもしろそうだな ) MuIe を利用していて、ある特定の操作で文字を削除し た場合、それらの文字はキルリングと呼はれる特別な部分 に保存されます。ここでは、バッフアから削除されてキル リングに移された文字列を、ふたたびバッファ上に戻すた めのガ去を紹介します。 前述した DEL や BS 、 C-d で文字を消去すると、バッ ファ上から消えた文字はキルリングに保存されません。そ の意味で、削除ではなく消去ということにします。いった ん消去した文字は、 undo ( 彳あ ) で復活させるしかガ去は ありません。一方、 C-k や C-w で削除した文字はすべて 19 、、 まででは紹介していま キルリングに保存されます せんが、キルリングに保存される削除コマンドには、はか にも ESC DEL 、 ESC d 、 ESC w があります。 キルリングに保存されている、バッフアから削除された 文字列を、ふたたひ取り出してバッフアに書き戻す ( ペー ストといいます ) ためのコマンドが、 C-y です。図 14 を 見てください。硼を指定して削除し、削除した部分をも う 1 度バッフアに書き戻している例です。例では C ー w を 使っていますが、 C-k を使っても同様のことができます。 基本重川乍は、以下のとおり簡単です。 1. 削除したい部分を C-k や C-w で削除する。削除され た文字列がキルリングに保存される。 2. キルリングの内容をベーストしたい位置に、カーソルを 移動ける。 3. C-y で、 1 で削除した文字列をベーストする。 キルリングに保存されている文字列は、ペーストしても 消えません。したがって、 2 、 3 を繰り返しおこなうこと により、同し文字列を佃度もペーストできます。 この機能を利用すれば、文の入替えや複製などがごく簡 単におこなえます。 Windows や Macintosh のワープロ などを利用した経験のある人は、マウスを使ったカット & ペーストをキーポードで実行していると考えれば、理解 しやすいかもしれません。 やり直し ! monkey : C-y は、 C-w で間違った範囲を指定して削除 19 キルリングの言物日はここでは説明しません。参考対になどを参照してく ださい。 UNIX MAGAZINE 1996.10