Unixコマンドにおける正規表現を使ったテキストファイルの検索方法を学ぶ

3 min読了の目安(約2800字TECH技術記事

LPIC勉強中に

正規表現を忘れてしまう!!!

という事実に直面したために、ひとまず記事を書いて自分の中での認識を整理しよう、ということになりました。

そもそもドキュメント読めば良いのでは?という突っ込みはもっともすぎて何も返せないのでやめてくださいしんでししまいます

正規表現を学ぶメリット

ひとまずこの記事を読んでいただく上で、正規表現を学ぶとこういうメリットがあるよ!ということを認識しておいていただくと読むか読まないかを決めやすくなると思うので、以下のようにメリットを定義しておきます。

  • 単純ゆえに学びやすい
  • 適用範囲が広く協力
  • 廃れにくい

それぞれについて少しばかり解説をしておきましょう。

単純ゆえに学びやすい

正規表現はシンプルなものです。
ルールがわかりやすい、というのは使う側にとって非常に重要な要素です。
後ほど解説しますが、基本さえ抑えておけば非常に広範な範囲に適用できます。

適用範囲が広く強力

これに関しては、ありとあらゆるプログラミング言語が正規表現をサポートしている、ということが何よりの根拠と言えるでしょう。それぞれのプログラミング言語で不変の要素というのは学ぶ上で非常にコスパが良いといえます。

廃れにくい

起源に目を向けてみると分かるのですが、正規表現自体はなんと半世紀近くも前に生まれたものなのです。
そんな時代から今まで生き残っている、ということはつまり上記の二点の裏付けにもなり得ますし、これからも恐らく廃れにくい分野の一つと考えても差し支えがないはずです。
できることならば陳腐化しにくい技術を学びたい、というのは自然な欲求だと思いますし、そんなあなたに正規表現。

この3つが学ぶ上でのメリットと考えている点です。
それではそもそも正規表現って何なの?という所に入っていきたいと思います。

なお、ここではLPIC Level1の出題範囲に沿って解説をしていきます。
正直な話、正規表現というテーマ一つで本が書けるほどの分量となってしまうので、この記事を読んだ上でさらに気になった方は末尾の参考図書を参考に買ってみると良いかもしれません。

そもそも正規表現とは?

では本題に入りましょう。

正規表現とは、

特定の条件を表す文字列を抽象的に表現したもの

である、と言えるでしょう。

初学者の方にはちょっと何言ってるのか分からない、と言われてもしょうがないような表現ではありますが、これが正しい表現なのです。

具体例

具体例で考えてみましょう。
例えば、例として以下のような条件に当てはまる文字列を抽出したい時にどのように表記をすれば良いでしょうか。

  • zから始まる7文字の文字列で、2文字目には「1」、「4」、「7」のいずれかが含まれている

これを正規表現で表すと、

z[147].....

となります。

このように表記することで、自動的に条件に合うような文字列を探してくれるのです。
どうです、便利だと思いませんか?

正規表現のルール

文字

文字はそのまま文字を表します。
例えば上記の例ではzが当てはまります。

任意の文字

任意の文字を表したい時には「.」(ピリオド)を使います。
上記の例では[147]の後の.....が当てはまります。
ここにはどんな文字が入っても良い、ということになります。

文字クラス

一連の文字集合を表したい時には[]でくくります。
例えば、[456]「4」「5」「6」のいずれかを1文字を表します。

行頭と行末

「^」は行頭を、「$」は行末を表します。
^aは行頭にあるaを、$zは行末にあるzを表します。

ちなみに^$は行頭と行末の間に何もないもの、つまり空白行を挿します。

なお、文字クラス[]の中では^は〜以外を表すことになっているので注意してください。

繰り返し

直前の文字の0回以上の繰り返しを表すには*を使います。

例えば、xy*zならば

  • xz
  • xyz
  • xyyz

を表す、ということになります。
xzも含めるという点に注意してください。

特殊文字

繰り返しの*などをメタキャラクタ、というのですがそれらを正規表現のルールとして使うのではなく、ただの文字として使いたい場合は\(バックスラッシュ)をメタキャラクタの前に置くことで文字として認識するようになります。

Unixコマンド

grepコマンド

grepコマンドはファイルやテキストストリームの中に正規表現によって表される検索文字列があるのかを調べます。

一般的な書式としては、

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

というものになります。

なお、オプションとメタキャラクタの欄に入るものとしては以下のようなものがあります。

オプション 説明
-c パターンがマッチした行の行数だけを表示する
-f 検索パターンをファイルから読み込む
-i 大文字小文字を区別せず検索する
-n 検索結果とあわせて行番号も表示する
-v パターンがマッチしない行を表示する
-E 拡張正規表現を使用する
メタキャラクタ 説明
+ 直前の文字の1回以上の繰り返し
? 直前の文字の0回もしくは1回の繰り返し
! 左右いずれかの記述にマッチする

sedコマンド

sed(Stream Editor)コマンドはテキストストリームに対して編集を行うコマンドです。
構文は以下の通りです。

sed [オプション] コマンド [ファイル]

オプションとコマンドは以下の通りです。

オプション 説明
-f コマンドが書かれたスクリプトファイルを指定する
コマンド 説明
d マッチした行を削除する
s パターンに基づいて置換する gスイッチを使うとマッチした部分全てを置換する
y 文字を変換する

終わりに

Zennで書いた初めての記事ですが、使いやすくてとてもいいサービスだなと思いました。

LPIC受験予定なのでこれからもそれ関連の記事を書くことが多くなると思います、興味ある方は是非よろしくお願いします。