正規表現

					2011年06月24日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2011/2011-06-24
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■復習

grep コマンド、 Emacs 文字列の置換え、

■正規表現(regular expression)

単純な検索 正規表現の例:「^a.*tion$」。「aで始まり、tionで終わるもの」。

^」、「.」、「*」、「$」 は、 メタキャラクタ。特別の意味を持つ。 メタキャラクタを含まない文字列も、正規表現として意味を持つ。

◆種類

種類
grep系
grep, ed, vi, ex, sed, less (lv)
egrep系
egrep, awk
Emacs
emacs
シェル系
csh, tcsh, sh
その他
Perl, Ruby, Apache, ....
シェルの「*,?,[]」などは、単にワイルドカードではなく、正規表現に 近い。複数の場所に「*」が書けるので、単なるワイルドカードではな い。

◆grep系の正規表現

grep は、文字列を検索するコマンド。

grep使われている正規表現

\
続く文字(メタキャラクタ)の意味をなくす
^
行の先頭。([]の中で使われたときには否定の意味)
$
行の終わり
.
任意の1文字
[c1c2c...cn]
c1c2c...cn のどれか。 例:[abc]ならabcのどれか。
[c1-c2]
c1からc2 の範囲のどれか。 例:[a-z]ならaからzまでのアルファベットの小文字。
[^c1c2c...cn]
並べられた文字以外。 例:[^abc]ならaでもなくbでもなくcでもないもの。
正規表現*
直前の「正規表現」の任意の繰り返し。 例:.*なら任意の文字の任意回数の繰り返し。 [a-z]*ならアルファベット小文字の任意回数の繰り返し。
正規表現1正規表現2
正規表現1に続き正規表現2が続く 例:abなら、「a」に続き「b」。
\(正規表現\)
タグ付き正規表現。 例: X\(abc\)*X は、XabcabcXにマッチする。
\N
N番目のタグ付き正規表現。 例: X\(abc\)\1X は、XabcabcXにマッチする。
\<
単語の先頭。vi, ex のみ。
\>
単語の終わり。vi, ex のみ。
正規表現 マッチする例 マッチしない例
abc abc, abcd ab
\\abc \abc, \abcd \ab
a.c aac, abc, xabc ac, a, c,
a*c c, ac, axc, aaac, xc a
[abc]x ax, bx, XaxX dx
[^abc]x dx, ex bx, Xbx, abx

◆egrep系

言語理論で定義された正規表現のうち、grep では使えなかったものがが使えるようになった。 ただし、一部、grep よりも落ちる。
正規表現+
正規表現の1回以上の繰り返し。「正規表現 正規表現*」と同じ。
正規表現?
正規表現が0回、または、1回。
正規表現1|正規表現2
正規表現1かまたは正規表現2。orの意味。
(正規表現)
正規表現のグループ化。
タグ付き正規表現\(\)やその参照\Nは廃止された。

◆Emacs の正規表現

grep系、egrep系の組み合わせ。|の意味が違い、egrepで |と書く所、Emacs では \|と書く。egrep で \|と書く所では、Emacs では|でよい。
正規表現1\|正規表現2
正規表現1かまたは正規表現2。orの意味。
\`
バッファの先頭
\'
バッファの最後
\w
単語
\W
単語以外
\b
単語の先頭、または、単語の末尾
\B
「単語の先頭および単語の末尾」以外
バッファ とは、Emacs でメモリを抽象化したもの。ファイルの内容を読み込み、編集で きる。保存しないと失われる。

■検索と置換え

◆Emacs の検索

通常(一括) インクリメンタル
正規表現なし search-forward isearch-forward
正規表現付き search-forward-regexp isearch-forward-regexp
方向は、-forward 以外に -backward がある。
C-r             isearch-backward
C-s             isearch-forward
C-M-r           isearch-backward-regexp
C-M-s           isearch-forward-regexp
C-M-s は、Esc C-s, C-M-r は、Esc C-r と同じ。

◆Emacs の置換え

一括 問合せ付き
正規表現なし replace-string query-replace
正規表現付き replace-regexp query-replace-regexp
M-%             query-replace
C-M-%           query-replace-regexp

◆コマンドラインでの検索

The Unix Super Text 33.1.3節 参照
grep
正規表現での検索。
egrep
正規表現での検索。+,?,|,() が使える。
fgrep
文字列での検索。正規表現は使えない。
sed
正規表現での検索(pコマンド)。
awk
正規表現での検索(printコマンド)。+,?,|,() が使える。

◆コマンドラインでの置換え

sed
正規表現での検索と、マッチした部分の参照。
awk で、正規表現で行を検索した後、printf()substr() による非正規表現で の置換えができる。

◆find コマンド

Unix の find コマンドは、ディレクトリ木をたどりながらファイルを検索する ことができる。 The Unix Super Text 33.1.5項 参照

注意点

◆メタキャラクタの衝突

シェルに対するコマンドで正規表現を打つときには、メタキャラクタの衝突に 気をつける。 正規表現で使うメタキャラクタbashのメタキャラクタ が重なっている。 シェルが正規表現の「$」や「*」を解釈しないように、 シングルクォート「''」でくくるなどして、エスケープする。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(2001) grepコマンド

grep コマンドの正規表現検索機能を使って、次のファイルや結果を検索しなさ い。 grep コマンドの正規表現検索機能を使って、次のコマンドの実行結果結果を検 索しなさい。 grepの正規表現を用いて,次のことを行いなさい。

★練習問題(2002) grepコマンド -v オプション

grep コマンドに -v オプションを与えると、マッチしなかった行を表示する。 この機能を確認しなさい。
$ grep    pattern file [←]
$ grep -v pattern file [←]

★練習問題(2003) grepコマンドの組み合わせ

複数のパタンの両方が含まれていることを検索するためには、単一の grep コ マンドではなく、複数のコマンドをパイプで結合して組み合わせることもよく 行われる。このことを実施してみなさい。
$ grep pattern1 file | grep pattern2 file [←]
$ cat file | pattern1  | grep pattern2 file [←]
$ grep pattern1 < file | grep pattern2 file [←]
このことと、次の結果を比較しなさい。
$ grep pattern1.*pattern2 file  [←]
$ grep pattern2.*pattern1 file  [←]
grep と grep -v を組み合わせる利用してみなさい。

★練習問題(2004) 正規表現によるWebサーバ・アクセスログの解析

Webサーバ・アクセスログ を観察する 練習問題(1106) 学類 Web サーバのアクセス・ログの観察 をもう一度行いなさい。

正規表現を用いて、検索してみなさい。 完璧を目指すのではなく、少々目的外のものが混じってもよいものとする。

★練習問題(2005) wcコマンド、sortコマンド、uniqコマンド

次のコマンドを利用してみなさい。

★練習問題(2006) egrep

grep の代わりに egrep を使ってみなさい。egrep 独自の機能を調べなさい。

★練習問題(2007) sed

The Unix Super Text 35.3 参照。 sed コマンドを使って、正規表現の検索を行いなさい。 sed コマンドを使って、正規表現の置換えを行いなさい。

★練習問題(2008) awk

awk コマンドを使って、正規表現の検索を行いなさい。

★練習問題(2009) 1行プログラミング

Ruby, Perl などのスクリプト言語が持つ1行プログラミングの機能を用いて、 正規表現の検索を行いなさい。
$ ruby -n -e 'print if /正規表現/' [←]

★練習問題(2010) lookコマンドと/usr/share/dict/words

look コマンドは、単語のスペルを調べるコマンドである。grep コマンドを用 いて、look コマンドと同じ単語が検索できることを確認しなさい。
$ cd /usr/share/dict [←]
$ head words [←]
$ tail words [←]
$ lv   words [←]
$ wc   words [←]
$ grep '^pattern' words [←]
$ look '^pattern' [←]

★練習問題(2011) レポート提出ページの.htaccess

レポート提出で用いている report.cgi プログラム は、次の場所にある。
$ ls    ~yas/secure_html/coins/literacy-2011/ [←]
$ ls -a ~yas/secure_html/coins/literacy-2011/ [←]
$ cat   ~yas/secure_html/coins/literacy-2011/.htaccess [←]
ここにある .htaccess にどのような記述がなされているかを調べなさい。

★練習問題(2012) 正規表現によるアクセス制御

Apache には、正規表現によりアクセス制御の対象となるファイル名や URL を 指定する機能がある。この機能を確認しなさい。

■課題20 正規表現

回答をテキスト・ファイルに記述し、(レポート提出 ページ)から提出しなさい。

(1) 正規表現の検索機能を用いて、次のファイルから次のことがらを検索して 画面に表示しなさい。レポートには結果だけでなく、どのようなコマンドを打っ たのかを示しなさい。head コマンドや tail コマンドと組み合わせて、表示の 行数を採点しやすい程度にしぼりなさい。

レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略しなさい。アクセス・ログに時分のページへのアク セスがない場合には、Web ブラウザでアクセスしてログに含ませなさい。

なお、grepコマンドには、or の機能がない。orが必要な場合、grep コマンド を複数回実行してもよい。egrep 機能を用いれば 1 回で終わることもある。

(2) 正規表現の検索機能を用いて、次のコマンドの実行結果から次のことがら を検索して画面に表示しなさい。

レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略することが望ましい。

(3) Emacs、または、sed コマンドの正規表現の置換え機能を用いて、次のこと を行いなさい。

レポートには、利用したプログラムの種別、そのプログラムに与えた命令を書 きなさい。

(4) [加点] find コマンド、sed コマンド等、または、このページで紹介した コマンドを組み合わせて、次のようなシェル・スクリプトを作成しなさい。

  1. Emacs のバックアップ・ファイル(末尾に「~」を含むもの)ファイルを探す。
  2. 1. のファイルのうち、元のファイル(末尾に「~」を含まないもの)を表示する。

(5) [加点] sed コマンド、または、このページで紹介したコマンドを組み合わ せて、次のいずれかのシェル・スクリプトを作成しなさい。

(5a) HTML からインライン・イメージのファイルを取り出す

(5b) [加点] 過去数日のWebサーバ・アクセスログから自分の WWW ページへの アクセスを、ファイルごとに数える。

(5c) [加点] 過去数日のWebサーバ・アクセスログから自分の WWW ページへの アクセスを、ファイルごとに数える。

(5d) [加点] 過去数日のWebサーバ・アクセスログを解析し、Web ブラウザの種 類ごとにアクセス数を調べる。


Last updated: 2011/06/24 11:29:08
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>