はじめに
このチュートリアルでは、Bash における正規表現(regex)について紹介します。正規表現は、テキスト内のパターンを見つけるための強力なツールです。正規表現を学ぶことで、シェルスクリプトのスキルが大幅に向上し、テキストの処理、データの抽出、タスクの自動化をより効果的に行うことができるようになります。このチュートリアルは初心者向けに設計されており、事前の正規表現の経験は必要ありません。基礎から始めて、徐々に知識を深めていきます。
このチュートリアルでは、Bash における正規表現(regex)について紹介します。正規表現は、テキスト内のパターンを見つけるための強力なツールです。正規表現を学ぶことで、シェルスクリプトのスキルが大幅に向上し、テキストの処理、データの抽出、タスクの自動化をより効果的に行うことができるようになります。このチュートリアルは初心者向けに設計されており、事前の正規表現の経験は必要ありません。基礎から始めて、徐々に知識を深めていきます。
正規表現の基本的な概念から始めましょう。正規表現とは、検索パターンを定義する文字のシーケンスです。テキストを検索するための非常に強力な方法と考えてください。
基本的な構成要素は次のとおりです。
abc は、文字列 "abc" に正確に一致します。. (ドット): 任意の単一文字(改行を除く)に一致します。したがって、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

出力は、文字列が "Hello" で始まることを示すはずです。
角括弧 [] を使用して定義される文字セットを使用すると、特定のグループから 1 つの文字をマッチさせることができます。これは、より柔軟なパターンを作成するのに非常に役立ちます。
[] 内では、ハイフン(-)を使用して範囲を指定できます。[a-z] は任意の小文字に一致し、[A-Z] は任意の大文字に一致し、[0-9] は任意の数字に一致します。これらを組み合わせることもできます:[a-zA-Z0-9] は任意の英数字に一致します。[] 内の最初の文字として ^ を配置すると、クラスを否定します。[^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 文字の文字列に一致するためです。
量指定子は、文字またはグループを何回繰り返すかを制御します。これにより、正規表現パターンに大きな力が加わります。
+ (プラス): 直前の文字を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' で終わる文字列に一致するためです。
括弧 () は、正規表現の一部をグループ化するために使用されます。これは、複数の文字に量指定子を適用したり、マッチしたテキストをキャプチャしたりするのに役立ちます。
括弧を使用すると、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 スクリプトを記述して実行することにより、これらの強力なツールに関する実践的な経験を積みました。理解を深めるために、さまざまな正規表現パターンを練習し、実験することを忘れないでください。