regex と略される正規表現は、テキストのパターンを記述します。grep、sed、awk などのツールで正規表現を使えますが、対応する構文は異なる場合があるため、必ずツールと正規表現の種類を確認してください。
高度なテキスト操作 · レッスン 1
正規表現 (Regular Expressions)
アンカー、文字集合、繰り返し、正規表現の種類が、テキストのパターンマッチングをどのように制御するかを学びます。
GNU grep は、既定で基本正規表現(BRE)を使い、-E を指定すると拡張正規表現(ERE)を使います。このレッスンでは、まず両方に共通する構文を紹介し、その後で一般的な ERE の追加機能を説明します。
例では次の入力を使います。
sally sells seashells
by the seashore
リテラルテキストに一致させる
通常の文字の多くは、その文字自体に一致します。パターン seashells は、その正確な並びをどこかに含む行を選びます。
$ grep 'seashells' sample.txt
sally sells seashells
マッチングツールが受け取る前にシェルが展開または分割しないよう、正規表現のパターンは引用符で囲んでください。正規表現はシェルのパス名展開とも異なります。正規表現の * は直前の要素を繰り返しますが、シェルの glob における * は、それ自体がパス名の文字列に一致するワイルドカードです。
ab* のような正規表現で、* は何をしますか?
一致位置を固定する
ブラケット式の外で、パターン先頭の ^ は、一致位置を行頭に固定します。
^by
$ アンカーは行末に一致します。
seashore$
行全体をパターンに一致させる場合は、両方のアンカーを組み合わせます。
^by the seashore$
行全体が by the seashore である場合だけ一致するパターンはどれですか?
1 文字に一致させる
通常の行単位の正規表現モードでは、ドットが任意の 1 文字に一致します。
b.
これは by に一致しますが、ba や b7 にも一致します。b の後に 1 文字必要なので、b だけには一致しません。リテラルのピリオドには \. とエスケープするか、適切なブラケット式に入れてください。
行全体を対象とするパターン ^b.$ に一致しない文字列はどれですか?
ブラケット式を使う
ブラケット式は、指定した集合から 1 文字に一致します。
s[ae]lls
これは、その位置に a または e がある salls または sells に一致します。
^ が [ の直後の最初の文字なら、集合を否定します。
s[^e]lls
最初の s の次の文字が e 以外でなければならないため、salls には一致しますが sells には一致しません。
[^e] は何に一致しますか?
範囲を使うと、両端の間にある文字を表せます。
d[a-c]g
これは dag、dbg、dcg に一致します。範囲の動作はロケールの照合順序に依存することがあります。[[:lower:]]、[[:upper:]]、[[:digit:]] などの文字クラスの方が、意図を明確に表せることがよくあります。
パターンを繰り返して組み合わせる
BRE と ERE のどちらでも、* は直前の要素を 0 回以上繰り返すことを意味します。
seashells*
これは seashell の後に s が 0 個以上続く文字列に一致します。grep -E の ERE モードで使える一般的な演算子には次のものがあります。
+:1 回以上の繰り返し?:0 回または 1 回の繰り返し|:左側または右側の式(...):式のグループ化
たとえば、次のように使います。
$ grep -E '^(cat|dog)s?$' animals.txt
これは、行全体が cat、cats、dog、dogs のいずれかである行を選びます。BRE モードではこれらの演算子のエスケープ規則が異なるため、種類を確認せずにパターンをコピーしてはいけません。
パターン ^(cat|dog)s?$ で拡張正規表現の構文を有効にするコマンドはどれですか?
Linux のテキストツールによる正規表現の選択を練習するには、次のハンズオンラボを利用してください。
- **Linux で grep を使用してテキストを検索する**:
grepでファイル内のテキストを検索し、基本検索、行番号表示、^と$による位置指定、基本および拡張正規表現を使った複雑なパターンマッチングを練習します。 - **テキスト処理と正規表現**:強力なテキスト処理ツール grep、sed、awk と、効率的なテキスト操作やパターンマッチングのための正規表現を学びます。
- **メールアドレスと数字の抽出**:grep と正規表現を使ってファイルからメールアドレスと数字を抽出し、Linux の重要なテキスト処理スキルを練習します。
レッスン完了
正規表現 (Regular Expressions) を完了しました
これで、行単位の基本的な正規表現を読み、作成できるようになりました。
正規表現演算子とシェルのパス名ワイルドカードを区別する。
一致位置を行頭または行末に固定する。
ドットまたはブラケット式で 1 文字に一致させる。
集合を否定し、ロケールを考慮した文字クラスを使う。
BRE または ERE の構文を意図的に選ぶ。