4. 正規表現
4-2. grep の正規表現を使った検索
grep は、対象ファイルのなかから検索文字列を探し、
その文字列を含む行全体を画面(標準出力)に表示します。
まず、ディレクトリ LaTeX に移動して下さい。
% cd LaTeX
次のコマンドを入力してみて下さい。
% grep is *.tex
準備で作成した3つのファイルの中から、is を含む行が表示されます。
ところが、Keisan など is の前後に文字が継っているものも表示されます。
このような場合には、is の前後に空白を入れたものを
'(アポストロフィー)で囲みます。
但しこの場合には、行頭や行末にある is は出力されません。
% grep ' is ' *.tex
2語以上連なる場合にも 'で囲みます。
次の2つを比べてみて下さい。
% grep of sec2.tex
% grep 'of precious' sec2.tex
では、行頭にある is を表示させたいときには、どのようにすれば
よいでしょうか?
このような検索をするのに、『正規表現』を使います。
正規表現とは、「いくつかの記号を用いてある(文字列の)パターンを
表現する」というものです。
次のコマンドを入力してみて下さい。
% grep ^is sec1.tex
% grep '^is' sec1.tex
どちらも行頭にある is を含む行だけが表示されましたね。
^ (キャレット、ハット) は行頭を表す文字(メタキャラクタ)です。
下の【注意】にもあるように、^is は 'で囲む方が良い使い方です。
では、sec1.tex のファイルの最後の行にある $$a^{-1}.$$ のように
文字 ^を含む行だけを表示させるには、どうしたら良いでしょうか?
次の2つはどちらもうまくいかないようです。
% grep ^ sec1.tex
% grep '^' sec1.tex
これは、^ が行頭を表すため行頭を含む行(すなわち全ての行)
が出力されるためです。
メタキャラクタの特別な意味を消す為には、メタキャラクタの前に
\ (バックスラッシュ)を添えます。これを『エスケープする』と
いったりします。(特別な意味から避難する?)
% grep '\^' sec1.tex
今度は、うまく表示されるはずです。
【注意】
正規表現は 上のように 'で囲むようにして下さい。
次のコマンドを実行してみて、その結果を比較してみて下さい。
% grep * sec1.tex
% grep '*' sec1.tex
また、正規表現以外で使われるメタキャラクタ( {,}など)
特殊な文字を含む場合も、'で囲むようにしましょう。
grep の正規表現で使われるメタキャラクタには次のようなものがあります。
\m メタキャラクタ m の特別な意味を消す。
^ 行頭を表す
$ 行末を表す
. 任意の1文字を表す
[abcdefg] 文字集合 {a,b,c,d,e,f,g} の中の任意の1文字を表す
[a-z] a から z までの任意の1文字を表す。
[^abcdefg] {a,b,c,d,e,f,g} のどれでもない任意の1文字を表す
r* 文字 r の0回以上の繰り返しを表す
^^^^^^^
次のコマンドを実行したら何が表示されるでしょう。
まず予想して、それから確かめて見ましょう。
また、他の組合せも考えて実験してみましょう。
% grep '\\' *.tex
% grep '\$a\$' *.tex
% grep '^\\section' *.tex
% grep '\$$' sec1.tex
% grep '\$\$' sec1.tex
% grep '\$\$$' sec1.tex
% grep '[Gg]roup' sec1.tex
% grep 'sec[^2]' text.tex
% grep 'itemi*' sec2.tex
% grep 'itemiz*' sec2.tex
% grep ' ........ ' sec2.tex (前後に空白がある)
% grep '........' sec2.tex
4-3. 演習問題
問題1
ルートディレクトリの直下にあるディレクトリを表示させて下さい。
次に look . の出力結果をみてみます。
% look .
look . は、スペルチェッカの辞書にある単語をすべて表示します。
問題2
ea ではじまり e で終わる4文字以上の単語を表示させて下さい。
ea ではじまり e で終わる5文字以上の単語を表示させて下さい。
問題3
ホームディレクトリ(ログインしたときのディレクトリ)に戻り、
次のコマンドを実行したときの結果を予想して下さい。
% ls doc[1-A]
% ls doc[A-1]
問題4
カレントディレクトリ(現在いるディレクトリ)に file1 file2 file3
という名前のファイルがあったとします。
それ以外のファイルが存在しないとき、
% cp *
というコマンドはどのように解釈されるでしょうか?
同じように file1 file2 の2つのファイルがあるときは、
上のコマンドはどのように解釈されますか?
file1 1つだけの場合はどのようになるでしょう。
また、ファイルが一つもないときはどうなるでしょう?
問題5
ホームディレクトリ(cd と打つ。ログインしたときのディレクトリ)
で次のコマンドを実行したときの結果を予想して下さい。
実際にコマンドを打って結果をたしかめて下さい。
% rm doc?
% rm doc??
【注意】---------------------------------------------------
| ファイルを消去する際にワイルドカード文字 * を使うのは、|
| 大変危険です。上の例で rm doc* とするところを |
| rm doc * と打ったら大変なことが起こります。 |
| (防止策は 2.エイリアス参照)
----------------------------------------------------------
[3.1] システムの設定
PC 上には中核をなすカーネルや様々なプログラムが動いています.
それらはそれぞれの PC に適切な設定をしてあげる必要があります.
皆さんはまだ一般ユーザでしかないのでシステムの設定を
することはできません. しかしこの実験の後半では皆さんに
OS のインストールやシステムの設定をやってもらうことになっています.
通常, プログラムの設定ファイルは /etc ディレクトリに置かれています.
そのことを最低限覚えておいて下さい.
[3.2] ユーザ自身の設定ファイル
まず以下のコマンドを実行して下さい.
$ ls -a ~/
そうすると見慣れない . (ドット)から始まるファイルがいくつも表示されると
思います. それらは総称して「ドットファイル」と呼ばれ, ユーザ毎の環境を
設定しているファイル達です. これらは一般にホームディレクトリに置かれて
いますが, 隠しファイルになっていて ls コマンドに -a オプションを
付けないと表示されません.
以下に有名なドットファイルを一覧します.
有名なドットファイルとその役割
ファイル名 |
役割 |
.bash_profile |
ログインシェルの設定. |
.bashrc |
ログインシェル以外のシェルの設定 |
.xsession |
X の設定ファイル. X を起動する際に呼び出すプログラムが
書かれている. |
.emacs |
エディタ emacs の設定ファイル |
.netscape |
netscape のキャシュやブックマークが保存されている. |
.ssh |
ssh の knownhost が保存されている. |
この他にも多くのドットファイルが存在します.
大抵「.(ドット) + アプリケーション名」になっています.
例として Unix での代表的なエディタ emacs の設定ファイルである
.emacs の役割をみてみましょう.
$ mv .emacs .emacs.bk
$ emacs
|
< 一度 .emacs ファイルを .emacs.bk に移動させます.
|
この状態で日本語のファイルを見てみましょう. おそらく文字化けして何も
読めないと思います. 次に emacs で .emacs というファイルを作成しましょう.
.emacs というファイルに以下の行を書いて下さい.
(set-language-environment "Japanese")
(set-default-coding-systems 'euc-japan)
(set-terminal-coding-system 'euc-japan)
(set-buffer-file-coding-system 'euc-japan)
(set-default-font "-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard")
|
この状態でemacs を起動しなおせば,
日本語のファイルが読めるようになったと思います.
さらに日本語変換ソフトウェアとして canna を使う場合は,
以下の行を .emacs に書き加えて下さい.
(set-input-method 'japanese-canna)
(global-set-key "\C-o" 'canna-toggle-japanese-mode)
(progn
(load-library "canna" )
(canna) )
|
emacs を起動しなおせば, canna を使って日本語が書けるようになったと思います.
日本語モードと英語モードを切替えるにはコントロールキーを押したままで o (オー)
を押して下さい.
このようにホームディレクトリ以下に存在するドットファイルは
ユーザ環境を構築するのに使われます.
誤って消してしまわないようにしましょう.
これらの雛型となるファイルは /etc/skel/ の下に格納されています.
ユーザのホームディレクトリが新規に作成された場合, /etc/skel/ の
下に存在するドットファイルがそのホームディレクトリにコピーされます
>> 次ページへ