Bash 正規表現マッチング

ShellBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、Bash における正規表現(regex)について紹介します。正規表現は、テキスト内のパターンを見つけるための強力なツールです。正規表現を学ぶことで、シェルスクリプトのスキルが大幅に向上し、テキストの処理、データの抽出、タスクの自動化をより効果的に行うことができるようになります。このチュートリアルは初心者向けに設計されており、事前の正規表現の経験は必要ありません。基礎から始めて、徐々に知識を深めていきます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 中級 レベルの実験の完了率は 54%です。学習者から 100% の好評価を得ています。

基本的な正規表現とマッチングの理解

正規表現の基本的な概念から始めましょう。正規表現とは、検索パターンを定義する文字のシーケンスです。テキストを検索するための非常に強力な方法と考えてください。

基本的な構成要素は次のとおりです。

  • リテラル文字(Literal Characters): ほとんどの文字は、それ自体に一致します。たとえば、正規表現 abc は、文字列 "abc" に正確に一致します。
  • メタ文字(Metacharacters): これらは、正規表現で特定の意味を持つ特殊な文字です。いくつかの主要なものを見てみましょう。
    • . (ドット): 任意の単一文字(改行を除く)に一致します。したがって、a.c は "abc"、"axc"、"a1c" などに一致します。
    • * (アスタリスク): 直前の文字を 0 回以上マッチさせます。ab*c は "ac"、"abc"、"abbc"、"abbbc" などに一致します。
    • ^ (キャレット): 行の先頭に一致します。^hello は "hello" で始まる行に一致します。
    • $ (ドル記号): 行の末尾に一致します。world$ は "world" で終わる行に一致します。
    • [] (角括弧): 文字クラスを定義します。角括弧内のいずれか 1 つの文字に一致します。[abc] は "a"、"b"、または "c" に一致します。[0-9] は任意の 1 桁の数字に一致します。

さて、理解度をテストするために Bash スクリプトを作成しましょう。touchコマンドを使用して、regex_test.shという名前のファイルを作成します。

cd ~/project
touch regex_test.sh

次に、テキストエディタ(nanoまたはvimなど)でregex_test.shを開き、次のコードを追加します。

#!/bin/bash

string="Hello World"
if [[ "$string" =~ ^Hello ]]; then
  echo "The string starts with Hello"
else
  echo "The string does not start with Hello"
fi

ファイルを保存し、実行可能にします。

chmod +x regex_test.sh

最後に、スクリプトを実行します。

./regex_test.sh
Regex and Matching

出力は、文字列が "Hello" で始まることを示すはずです。

スクリプトでの文字セットの操作

角括弧 [] を使用して定義される文字セットを使用すると、特定のグループから 1 つの文字をマッチさせることができます。これは、より柔軟なパターンを作成するのに非常に役立ちます。

  • 文字範囲(Character Ranges): [] 内では、ハイフン(-)を使用して範囲を指定できます。[a-z] は任意の小文字に一致し、[A-Z] は任意の大文字に一致し、[0-9] は任意の数字に一致します。これらを組み合わせることもできます:[a-zA-Z0-9] は任意の英数字に一致します。
  • 否定(Negation): [] 内の最初の文字として ^ を配置すると、クラスを否定します。[^0-9] は、数字ではない任意の文字に一致します。

文字セットを使用するように、regex_test.shスクリプトを変更しましょう。テキストエディタでregex_test.shを開き、その内容を以下に置き換えます。

#!/bin/bash

string="cat"
if [[ "$string" =~ c[a-z]t ]]; then
  echo "Match found!"
else
  echo "No match."
fi

ファイルを保存して実行します。

./regex_test.sh

出力は "Match found!" を示すはずです。これは、c[a-z]t が 'c' で始まり 't' で終わり、真ん中の文字が小文字である 3 文字の文字列に一致するためです。

スクリプトでパターンを繰り返すための量指定子(Quantifiers)の使用

量指定子は、文字またはグループを何回繰り返すかを制御します。これにより、正規表現パターンに大きな力が加わります。

  • + (プラス): 直前の文字を1 回以上マッチさせます。ab+c は "abc"、"abbc"、"abbbc" などに一致しますが、"ac" には一致しません
  • ? (疑問符): 直前の文字を0 回または 1 回マッチさせます(つまり、直前の文字をオプションにします)。ab?c は "ac" と "abc" に一致しますが、"abbc" には一致しません。
  • * (アスタリスク): 直前の文字を0 回以上マッチさせます。これは先ほど見ました。
  • {n}: 直前の文字を正確にn回マッチさせます。a{3} は "aaa" に一致します。
  • {n,}: 直前の文字をn 回以上マッチさせます。a{2,} は "aa"、"aaa"、"aaaa" などに一致します。
  • {n,m}: 直前の文字をn 回から m 回(両端を含む)マッチさせます。a{1,3} は "a"、"aa"、または "aaa" に一致します。

量指定子を使用するように、regex_test.shスクリプトを変更しましょう。テキストエディタでregex_test.shを開き、その内容を以下に置き換えます。

#!/bin/bash

string="abbbc"
if [[ "$string" =~ ab+c ]]; then
  echo "Match found!"
else
  echo "No match."
fi

ファイルを保存して実行します。

./regex_test.sh

出力は "Match found!" を示すはずです。これは、ab+c が 'a' で始まり、1 つ以上の 'b' が続き、'c' で終わる文字列に一致するためです。

スクリプトでキャプチャグループ(Capturing Groups)を使用してデータを抽出する

括弧 () は、正規表現の一部をグループ化するために使用されます。これは、複数の文字に量指定子を適用したり、マッチしたテキストをキャプチャしたりするのに役立ちます。

括弧を使用すると、Bash はその正規表現の部分にマッチしたテキストを BASH_REMATCH と呼ばれる特別な配列に格納します。BASH_REMATCH[0] にはマッチした文字列全体が含まれ、BASH_REMATCH[1] には最初のグループにマッチしたテキスト、BASH_REMATCH[2] には 2 番目のグループにマッチしたテキストなどが含まれます。

キャプチャグループを使用してデータを抽出するように、regex_test.shスクリプトを変更しましょう。テキストエディタでregex_test.shを開き、その内容を以下に置き換えます。

#!/bin/bash

string="apple123"
if [[ "$string" =~ ^([a-z]+)([0-9]+)$ ]]; then
  fruit="${BASH_REMATCH[1]}"
  number="${BASH_REMATCH[2]}"
  echo "Fruit: $fruit"
else
  echo "No match."
fi

ファイルを保存して実行します。

./regex_test.sh

出力には "Fruit: apple" が含まれるはずです。このスクリプトは、キャプチャグループを使用して文字列から果物の名前を抽出します。

スクリプトで sed を使用してテキストを置換する

sed の使用を練習するために、sed_test.sh という新しいスクリプトを作成しましょう。

cd ~/project
touch sed_test.sh
chmod +x sed_test.sh

テキストエディタで sed_test.sh を開き、以下を追加します。

#!/bin/bash

string="apple123"
echo "$string" | sed 's/[0-9]/X/g'

ファイルを保存して実行します。

./sed_test.sh

出力は次のようになります:appleXXX。このスクリプトは、sed を使用して、文字列内のすべての数字を文字 "X" に置き換えます。

概要

このチュートリアルでは、Bash での正規表現(regex)について紹介しました。基本的な正規表現の概念、文字クラス、量指定子、グループ化、キャプチャ、および sed での正規表現の使用方法について学びました。Bash スクリプトを記述して実行することにより、これらの強力なツールに関する実践的な経験を積みました。理解を深めるために、さまざまな正規表現パターンを練習し、実験することを忘れないでください。