初心者目線のLPIC講座 〜わかりやすいかも、このサイト〜

初心者目線のLPIC講座 > 正規表現 > 正規表現とは

正規表現

正規表現とは

メタキャラクタという、意味のある記号を用いて文字列のパターンを表現する方法を正規表現と言います。

なお、ここで出てくるコマンドは「grep」「sed」です。

bashシェル」のところでもメタキャラクタについて説明しましたが、大体使い方は一緒です。なんか若干違う物はあるみたいですが。

例えば、下に一覧を示しますが、「任意の一文字」を表すのに、bashシェルで使うメタキャラクタは、「?」であるのに対し、正規表現ではドット「.」一文字なんですね。

非常に紛らわしいので覚える時はちょっと面倒ですが、「bashシェル用」と「正規表現用」と混乱しないようにしましょう。

では正規表現のメタキャラクタを紹介します。

.・・・任意の1文字

*・・・直前の文字の0回以上の繰り返し

+・・・直前の文字の1回以上の繰り返し

[文字]・・・[]内の文字のいずれか1文字

^・・・行の先頭

$・・・行の末尾

\・・・この記号の直後にある文字をメタキャラクタではなく文字として扱う

このメタキャラクタを使った正規表現が以下になります。

a..b・・・aで始まってbで終わる4文字の文字列

.*・・・0文字以上の任意の文字列

[abc]・・・aまたはbまたはc

[a-z]・・・a〜z(アルファベットの小文字)のうち1文字

[A-Z]・・・A〜Z(アルファベットの大文字)のうち1文字

[0-9]+・・・数字

[a-zA-Z]・・・アルファベット1文字(大文字小文字問わず)

^$・・・空行

.*@lpic\.jp・・・lpic.jpドメインのメールアドレス

[]で囲まれたものに関しては、「その中のどれか1つ」を表すと覚えておけばよさそうですね。

さて、正規表現を扱うコマンドとして1つめの「grep」コマンドを紹介しましょう。

「grep」コマンド

意味:指定されたパターンの文字列をファイル内から検索する。

書式:grep [オプション] 検索パターン [ファイル名]

オプション:

-c・・・マッチした行数だけを出力する

-i・・・大文字と小文字を区別しない

-n・・・マッチした行を行番号付きで出力する

-v・・・マッチしない行を出力する

まず普通の「grep」コマンドの例を見てみます。今、textfileというファイルの中身が以下だとします。

$ cat textfile

this is a pen
that is a ball
I am john
basket ball

ここで、文字列「ball」の含まれた行だけを抜き出したい時、

$ grep ball textfile

that is a ball
basket ball

という結果になります。

さて、この「grep」コマンドにメタキャラクタを用いた例を示します。先ほどの「textfile」から、行頭が「th」という文字列を含んだ行を除いて出力します。ちなみにメタキャラクタを指定する時には「'that'」のように引用符「'」で囲みます。

$ grep -v '^th' textfile

I am john
basket ball

続いて「sed」コマンドです。これはテキストの文字列に編集を行って出力するコマンドです。

「sed」コマンド

意味:テキストデータを編集して出力する。

書式:sed [オプション] [ファイル名]

オプション:

-f ファイル名・・・sedコマンドが記述されたファイルを指定する

「sed」で使用できるコマンド:

s・・・パターンに基づき置換する

d・・・マッチした行を削除する

 

では例を見ましょう。「textfile2」の中身が以下のようだとします。

$ cat textfile2

unix java
php unix
c ruby unix

ここから「unix」という文字列を「linux」に変えたい時は、「sed」コマンドと更に「s」コマンドを使います。ちなみに変換前と変換後の文字列は「/変換前/変換後/」のように「/」で囲みます。

$ sed s/unix/linux/ textfile

linux java
php unix
c ruby unix

おっと、「unix」という文字列は3行全てにあるっていうのに、1行しか変わっていませんね。これを全て置換したい時には、オプション「g」を付けます。

$ sed s/unix/linux/g textfile

linux java
php linux

c ruby linux

今度はちゃんと置換されました。


スポンサードリンク