本日のお品書き
- 正規表現の復習
- SGML, XML, HTML についての講義と実習
- ネットワークの基礎知識
- 情報処理技術者試験試験対策
正規表現の復習
grep の使い方
grep
という UNIX コマンドがある。
これを使ってみよう。grep
は2つ引数をとって
grep pattern file
などとする。コマンドの意味は,正規表現の
パターンをファイル中から見つけ出して標準出力(デフォルトでは画面)に出
力してくれるコマンドである。grep abc ファイル名
とすれば,
ファイルから文字列 abc を含む行だけが出力される。
grep html index.html
とすれば,html を含む行だけが出力される。
egrep
というコマンドもあって,こちらは拡張された正規表現を使うことができる(grep -E
と同じ意味である)。
あるファイルの中から,HTML のタグを含む行だけを抜き出してくるには,
egrep '<[\/A-z]+>' index.html
などとする。正規表現をシングルクォートで囲むのは,正規表現で指定するパターンがシェル (前回の復習!覚えてるかい?)によって展開されてしまうのを避けるためである。
この正規表現の意味は,<
で始まってスラッシュかアルファベットの大文字か小文字が 1 回以上
(正規表現中の+
の意味は最低1回は前の文字が続くことだった)
繰り返され,>
が続くパターン,という意味になる。
スラッシュは正規表現中では特別な意味を持つので,その意味を消す (エスケープするという)ためにスラッシュの前にバックスラッシュ書いてある。
演習1: htmlの開始タグだけを表示する正規表現を書け。
より正確な正規表現としては,<br />
タグなどのように,
末尾に空白が複数回(0回でも良い)挿入され,かつスラッシュが入って,最後
に>
が来るようなパターンにも対応しなければならない。こ
れは次のように指定すれば良い。
grep -E '<[\/A-z][A-z]* */*>' *.html | nkf --utf8
パイプ(|
これも前回の復習!覚えてる?)でつないで nkf
に出力を渡しているのは,日本語の文字コードを UTF8 にしてターミナルエミュレータで
正しく表示させるためである。
さらに,スラッシュは<
の直後に一度だけしか現れないので
それを正確に表現するために最初の文字だけ<[\/A-z]
と
スラッシュを含み,次の文字は[A-z]
とスラッシュを含まない表現にしてある。
検索結果が多過ぎて画面がスクロールしてしまうようならば,
さらにlv
をパイプでつないで,
grep -E '<[\\A-z][A-z]*[ \/]*>' index.html | nkf --utf8 | lv -Ou8
などとしなければならない。
Emacs での正規表現の利用
正規表現は Emacs でも使うことができる。エスケープキーを一度押して,すぐに離して,それからある文字をタイプすることを M-
と表現するとすると,エスケープキーを押して,次に,x
をタイプすることはM-x
と表せる。Emacs 中から,正規表現を使って文字列の置換を行うためには,
M-x replace-regexp
である。ちなみに,正規表現ではなく,ただの文字列を置換するだけならM-x replace-string
というコマンドも利用できる。
演習2 Emacs を使って,html タグ<ol>
を<ul>
に変換する練習を行え。
正規表現を使った高度な置換を行う方が良いのか,それとも単純な文字列の置換を複数回行った方が良いのか,迷うこともあるだろう。検索漏れを防ぐためにも,単純な文字列の置換が何種類もある場合には,正規表現を使った方がよいだろう。
コマンドラインからあるファイル中の文字列を置換するコマンドしては,tr
というコマンドも用意されている。index.html に現れるアルファベットをすべて大文字にしたければ,
tr a-z A-Z < index.html > index-new.html
もしくは,
cat index.html | tr a-z A-Z > index-new.html
などとすればよい。また UNIX には sed
というストリームエディタがあって,コマンドラインからでもかなり強力な文書編集ができる。慣れてきたら使ってみると良い。