秀丸に限らず、テキストファイルから特定の文字列を検索したい場合はよくあり ます。また、検索された文字列を別の文字列に置き換える、置換という作業は、 検索の延長とも言えます。
grepとは聞き慣れない言葉かも知れませんが、UNIXではよく使われるコマンドの 一つです。検索と同様に、特定の文字列を含む行をファイルから抽出してくれま す。特定の文字列をパターンとしてパターンマッチング とも呼ばれます。 そのgrepが秀丸では使用することができますので、grepを使用した演習も下 記に用意してあります。
パターンマッチングおよびgrepに関する説明が こちらのページにあります。 また、UNIXのgrepの使い方に興味がある人は こちらのペー ジを参照してください。
正規表現とは、テキストデータを処理する際に非常に重要な機能と言えます。 正規表現という言葉は、regular expressionという英語が訳された言葉で、 一定の規則性(パターン)を符号で表現することを指します。
UNIXの世界の正規表現と、秀丸の正規表現では若干異なる面もあります。以下に、 秀丸における正規表現の例を示します。秀丸のへルプからも参照することができ ますが、ここでは重要なものだけを紹介します。
メタキャラクタ | 意味 |
---|---|
[ ] | キャラクタクラス 例:本[屋店] → 「本屋」「本店」の言葉を検索 |
| | パターンの論理和 例:本屋|本店 → 「本屋」「本店」の言葉を検索 |
( ) | パターンのグループ化 例:社会(人|生活|学部) → 「社会人」「社会生活」「社会学部」の言葉を検索 |
. | 改行を除く任意の1文字 |
* | 直前のパターンの0回以上の繰り返し 注意:.* と組み合わせて、任意の長さの文字列として使われることが多い 例:東.*駅 → 「東京駅」「東神奈川駅」などの言葉を検索 |
+ | 直前のパターンの1回以上の繰り返し |
? | 直前のパターンが0回または1回出現 |
^ | 行頭 注意:[^a]のような場合、否定の意味になる(左の例では、"aでない"という意 味になる) |
$ | 行末 |
\w | 英単語 |
\< | 英単語の始まり |
\> | 英単語の終わり |
上記の(や?は、 特別な意味を持つ記号として使われます。そのような記号そのものを検索したい 場合には、エスケープ文字\をつけて、 \(や\?のように 指定する必要がありますので、注意してください。
それでは、上記で学習した秀丸での正規表現を実際に試してみましょう。 下記の「コンピュータリテラシ─のシラバス」のリンク先のファイルを コピーして、秀丸での新規作成画面に貼り付けてください。そして、 「検索での指定」にしたがって、検索してみてください。
各目的 | 検索での指定 | |
---|---|---|
論理和の検索 | 「Linux」も「Windows」も検索したいとき | Linux|Windows |
「情報学部」も「情報学科」も検索したいとき | 情報学[部科] | |
「コンピュータ社会」以外の「コンピュータ****」という言葉を検索したい とき | コンピュータ[^社会] | |
数字の検索 | 2桁の数字だけを検索したいとき | [0-9][0-9] |
1桁か2桁の数字だけを検索したいとき | [0-9]+ | |
ローマ字の検索 | 英単語だけを検索したいとき | \w |
ローマ字(小文字だけ)1字を検索したいとき | [a-z] | |
ローマ字(大文字だけ)1字を検索したいとき | [A-Z] | |
ローマ字(大文字・小文字関係なく)1字を検索したいとき | [A-Za-z] | |
ローマ字(大文字・小文字関係なく)3字で構成される英単語を検索したいとき | \<[A-Za-z][A-Za-z][A-Za-z]\> | |
その他 | <演習名>のように< >で囲まれた言葉だけを検索したいとき | <.*> |
検索画面の様子を下記の画像に示しますが、検索を正常に機能させるための注意点とし て下記の2点がありますので、うまく検索できないときには確認してください。
検索のやり方は身についたでしょうか?検索ができれば、置換もできるはずです。 また、メニューバーの
を指定し、検索条件を入力して実行させることで、検索条件に合致する言葉を含 む行が別のファイルに出力されます。上記の検索の指定を、このgrepに対しても 試してみてください。
題材:情報大の教員リストの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>
正規表現を用いた検索、置換では、最長パターンが検索される。 <.*">に該当するパターンは、
という表現においては、
と2種類存在するが、最長パターンが検出されるために、2番目の表現が置換の対 象となり、名前の直前までの表現が全て消去されたというわけである。 ちなみに、名前の後ろにも">というタグが存在する場合には、 教員氏名そのものも置換されてなくなってしまうので、別の指定が必要となる。
つぎに、教員氏名の後ろについているタグを除去したいが、これも長さが2種類 ある。この場合には、
と指定することで、全てのタグが消去され、下記の結果のようになる。
井上貞明 内田治 岡本眞一 菊池豊彦 Kevin Short 櫻井尚子 須崎純一 鈴木英男 関口益照 高仲實則 中尾宏 林正康 原朗 原慶太郎 東山定生 前林行雄 山崎和子
上記の結果を利用して、まずは「学科名」を教員氏名の前に挿入したい。 正規表現では、行頭を「^」と 表現するので、
と指定することで、「環境情報学科:」という文字列が、全行の先頭に 挿入される。
環境情報学科:井上貞明 環境情報学科:内田治 環境情報学科:岡本眞一 環境情報学科:菊池豊彦 環境情報学科:Kevin Short 環境情報学科:櫻井尚子 環境情報学科:須崎純一 環境情報学科:鈴木英男 環境情報学科:関口益照 環境情報学科:高仲實則 環境情報学科:中尾宏 環境情報学科:林正康 環境情報学科:原朗 環境情報学科:原慶太郎 環境情報学科:東山定生 環境情報学科:前林行雄 環境情報学科:山崎和子
そして、今度は行末に「先生」という文字列を挿入したい。正規表現では、行末を 「$」と表現するが、秀丸で実際に指定 してみると希望通りに動作しなかった。したがって、下記のように、改行文字 \nを利用して、
と指定することで、下記の結果に至る。
環境情報学科:井上貞明先生 環境情報学科:内田治先生 環境情報学科:岡本眞一先生 環境情報学科:菊池豊彦先生 環境情報学科:Kevin Short先生 環境情報学科:櫻井尚子先生 環境情報学科:須崎純一先生 環境情報学科:鈴木英男先生 環境情報学科:関口益照先生 環境情報学科:高仲實則先生 環境情報学科:中尾宏先生 環境情報学科:林正康先生 環境情報学科:原朗先生 環境情報学科:原慶太郎先生 環境情報学科:東山定生先生 環境情報学科:前林行雄先生 環境情報学科:山崎和子先生