秀丸での検索、置換、grep(正規表現の利用)

検索、置換、grep

秀丸に限らず、テキストファイルから特定の文字列を検索したい場合はよくあり ます。また、検索された文字列を別の文字列に置き換える、置換という作業は、 検索の延長とも言えます。

grepとは聞き慣れない言葉かも知れませんが、UNIXではよく使われるコマンドの 一つです。検索と同様に、特定の文字列を含む行をファイルから抽出してくれま す。特定の文字列をパターンとしてパターンマッチング とも呼ばれます。 そのgrepが秀丸では使用することができますので、grepを使用した演習も下 記に用意してあります。

パターンマッチングおよびgrepに関する説明が こちらのページにあります。 また、UNIXのgrepの使い方に興味がある人は こちらのペー ジを参照してください。

秀丸での正規表現

正規表現とは、テキストデータを処理する際に非常に重要な機能と言えます。 正規表現という言葉は、regular expressionという英語が訳された言葉で、 一定の規則性(パターン)を符号で表現することを指します。

UNIXの世界の正規表現と、秀丸の正規表現では若干異なる面もあります。以下に、 秀丸における正規表現の例を示します。秀丸のへルプからも参照することができ ますが、ここでは重要なものだけを紹介します。

メタキャラクタ 意味
[ ] キャラクタクラス
例:本[屋店] → 「本屋」「本店」の言葉を検索
| パターンの論理和
例:本屋|本店 → 「本屋」「本店」の言葉を検索
( ) パターンのグループ化
例:社会(人|生活|学部) → 「社会人」「社会生活」「社会学部」の言葉を検索
. 改行を除く任意の1文字
* 直前のパターンの0回以上の繰り返し
注意:.* と組み合わせて、任意の長さの文字列として使われることが多い
例:東.*駅 → 「東京駅」「東神奈川駅」などの言葉を検索
+ 直前のパターンの1回以上の繰り返し
? 直前のパターンが0回または1回出現
^ 行頭
注意:[^a]のような場合、否定の意味になる(左の例では、"aでない"という意 味になる)
$ 行末
\w 英単語
\< 英単語の始まり
\> 英単語の終わり

上記の(?は、 特別な意味を持つ記号として使われます。そのような記号そのものを検索したい 場合には、エスケープ文字\をつけて、 \(\?のように 指定する必要がありますので、注意してください。

秀丸での正規表現を踏まえた検索、置換、grep

それでは、上記で学習した秀丸での正規表現を実際に試してみましょう。 下記の「コンピュータリテラシ─のシラバス」のリンク先のファイルを コピーして、秀丸での新規作成画面に貼り付けてください。そして、 「検索での指定」にしたがって、検索してみてください。

注意:

検索画面の様子を下記の画像に示しますが、検索を正常に機能させるための注意点とし て下記の2点がありますので、うまく検索できないときには確認してください。

検索条件の指定画面

検索のやり方は身についたでしょうか?検索ができれば、置換もできるはずです。 また、メニューバーの

検索 → grepの実行

を指定し、検索条件を入力して実行させることで、検索条件に合致する言葉を含 む行が別のファイルに出力されます。上記の検索の指定を、このgrepに対しても 試してみてください。

課題

  1. これまでに学習した正規表現を置換において使 用して、下記の目的を達成せよ。
    1. 題材:情報大の教員リストのWebページ →[こちらをクリック]
      目的:
        HTMLソー ス(環境情報学科の教員分だけ抜粋してコピー)
        教員の 氏名のリストの作成
        学科名 +教員氏名+先生という表現のリストの作成

      (この問題の解答はこちらに)

    2. 題材:情報大の環境情報学科1年生のリストのWebページ →[こちらをクリック(学内のみ閲覧可)]
      目的:
      1. Webページのコピー学生のリスト(氏名のみ)の作成
      2. Webページのコピー学生のリスト(氏名+学籍番号)の作成
      3. Webページの ソースのコピー学生のEDUのEメー ルアドレスのリストの作成
  2. 「鶴亀メール」では、既存のメールに対しては、 などを対象に、複数の条件を設定して検索することができる。これまでに届いた メールを対象に、適当な検索を実行してみよ。正規表現を利用した検索を 実行する場合には、「正規表現」をチェックすることを忘れないように。

課題の解答(Iのみ)

題材:情報大の教員リストのWebページのHTMLソース [下記の部分のみを対象とする]

<tr><td align="center">井上貞明</td></tr>
<tr><td align="center">内田治</td></tr>
<tr><td align="center">岡本眞一</td></tr>
<tr><td align="center">菊池豊彦</td></tr>
<tr><td align="center">Kevin Short</td></tr>
<tr><td align="center">櫻井尚子</td></tr>
<tr><td align="center"><a href="http://www.edu.tuis.ac.jp/~susaki/lab/">須崎純一</a></td></tr>
<tr><td align="center">鈴木英男</td></tr>
<tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~sekiguch/prof_sekiguch/">関口益照</a></td></tr>
<tr><td align="center">高仲實則</td></tr>
<tr><td align="center">中尾宏</td></tr>
<tr><td align="center">林正康</td></tr>
<tr><td align="center">原朗</td></tr>
<tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~hara/">原慶太郎</a></td></tr>
<tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~higashi/">東山定生</a></td></tr>
<tr><td align="center">前林行雄</td></tr>
<tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~yamasaki/">山崎和子</td></tr>

教員氏名のリストの作成

まず、教員氏名の前にあるHTMLタグを除去したい。そのタグも全員分同じでは なく、

のように長さが異なる。このようなタグを一度に取り除くために、共通するルー ルを考える。すると、<で始まり、">で終わ るという共通項が見える。この点を考慮して、秀丸の「検索 → 置換」 では、下記のように指定する。

置換条件の指定画面

この結果、下記の通りとなる。

井上貞明</td></tr>
内田治</td></tr>
岡本眞一</td></tr>
菊池豊彦</td></tr>
Kevin Short</td></tr>
櫻井尚子</td></tr>
須崎純一</a></td></tr>
鈴木英男</td></tr>
関口益照</a></td></tr>
高仲實則</td></tr>
中尾宏</td></tr>
林正康</td></tr>
原朗</td></tr>
原慶太郎</a></td></tr>
東山定生</a></td></tr>
前林行雄</td></tr>
山崎和子</td></tr>

正規表現を用いた検索、置換では、最長パターンが検索される。 <.*">に該当するパターンは、

<tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~yamasaki/">

という表現においては、

  1. <tr><td align="center">
  2. <tr><td align="center"><a href="http://www.rsch.tuis.ac.jp/~yamasaki/">

と2種類存在するが、最長パターンが検出されるために、2番目の表現が置換の対 象となり、名前の直前までの表現が全て消去されたというわけである。 ちなみに、名前の後ろにも">というタグが存在する場合には、 教員氏名そのものも置換されてなくなってしまうので、別の指定が必要となる。

つぎに、教員氏名の後ろについているタグを除去したいが、これも長さが2種類 ある。この場合には、

と指定することで、全てのタグが消去され、下記の結果のようになる。

井上貞明
内田治
岡本眞一
菊池豊彦
Kevin Short
櫻井尚子
須崎純一
鈴木英男
関口益照
高仲實則
中尾宏
林正康
原朗
原慶太郎
東山定生
前林行雄
山崎和子

学科名+教員の氏名+先生という表現のリストの作成

上記の結果を利用して、まずは「学科名」を教員氏名の前に挿入したい。 正規表現では、行頭を「^」と 表現するので、

と指定することで、「環境情報学科:」という文字列が、全行の先頭に 挿入される。

環境情報学科:井上貞明
環境情報学科:内田治
環境情報学科:岡本眞一
環境情報学科:菊池豊彦
環境情報学科:Kevin Short
環境情報学科:櫻井尚子
環境情報学科:須崎純一
環境情報学科:鈴木英男
環境情報学科:関口益照
環境情報学科:高仲實則
環境情報学科:中尾宏
環境情報学科:林正康
環境情報学科:原朗
環境情報学科:原慶太郎
環境情報学科:東山定生
環境情報学科:前林行雄
環境情報学科:山崎和子

そして、今度は行末に「先生」という文字列を挿入したい。正規表現では、行末を 「$」と表現するが、秀丸で実際に指定 してみると希望通りに動作しなかった。したがって、下記のように、改行文字 \nを利用して、

と指定することで、下記の結果に至る。

環境情報学科:井上貞明先生
環境情報学科:内田治先生
環境情報学科:岡本眞一先生
環境情報学科:菊池豊彦先生
環境情報学科:Kevin Short先生
環境情報学科:櫻井尚子先生
環境情報学科:須崎純一先生
環境情報学科:鈴木英男先生
環境情報学科:関口益照先生
環境情報学科:高仲實則先生
環境情報学科:中尾宏先生
環境情報学科:林正康先生
環境情報学科:原朗先生
環境情報学科:原慶太郎先生
環境情報学科:東山定生先生
環境情報学科:前林行雄先生
環境情報学科:山崎和子先生

[文書作成(秀丸)のページに戻る] [コンピュータリテラシー演習のホームに戻る]
須崎純一 東京情報大学総合情報学部環境情報学科
susaki@rsch.tuis.ac.jp