Bash でのパターン マッチング

Olorunfemi Akinlua 2023年6月20日
  1. =~ 演算子をパターン マッチングに使用する
  2. * 演算子をパターン マッチングに使用する
  3. パターン マッチングに subpatterns を使用する
Bash でのパターン マッチング

パターン マッチングは Bash の強力な機能で、文字列をパターンと比較して一致を見つけたり、比較結果に基づいてアクションを実行したりできます。 これは、文字列の形式をチェックしたり、大きな文字列から部分文字列を抽出したりする場合に役立ちます。

この記事では、Bash でパターン マッチングを行う方法について説明し、パターン マッチングで使用される一般的な演算子と手法について説明します。

=~ 演算子をパターン マッチングに使用する

Bash でパターン マッチングがどのように機能するかを理解するために、まず、パターン マッチングを実行するために使用される =~ 演算子を見てみましょう。 この演算子は、照合する文字列と比較するパターンの 2つのオペランドを取ります。

たとえば、URL を含む my_string という文字列があり、それが "http" または "https" で始まるかどうかを確認したいとします。 =~ 演算子を使用してこの比較を実行できます。

my_string="https://www.example.com"

if [[ $my_string =~ ^https?:// ]]; then
  echo "The string starts with a valid URL"
fi

出力:

The string starts with a valid URL

上記のコードでは、=~ 演算子を使用して my_string 変数をパターン ^https?:// と比較しています。 ^ 文字は、文字列の先頭でパターンが一致する必要があることを示し、? 文字は character は、先行する文字 (この場合、httpss) がオプションであることを示します。

これは、パターンが文字列の先頭にある "http://" または "https://" のいずれかに一致することを意味します。

比較が成功すると、if ステートメントが実行され、メッセージ "文字列は有効な URL で始まります" が出力されます。

* 演算子をパターン マッチングに使用する

パターン マッチングでよく使用されるもう 1つの演算子は、* (アスタリスク) 文字です。これは、前の文字が 0 回以上一致する可能性があることを示します。 たとえば、数値を含む文字列があり、それが小数点以下 2 桁までの有効な 10 進数であるかどうかを確認したいとします。

* 演算子を使用してこの比較を実行できます。

my_string="3.14"

if [[ $my_string =~ ^[0-9]+.[0-9]{0,2}$ ]]; then
echo "The string is a valid decimal number"
else
echo "The string is not a valid decimal number"
fi

出力:

The string is a valid decimal number

上記のコードでは、=~ 演算子を使用して my_string 変数をパターン ^[0-9]+\.[0-9]{0,2}$ と比較しています。 ^ 文字はパターンが文字列の先頭で一致する必要があることを示し、$ 文字はパターンが最後で一致する必要があることを示します。

[0-9] 文字クラスは 0 から 9 の任意の数字と一致し、+ 文字は前の文字クラスが 1 回以上一致する必要があることを示します。

\ (バックスラッシュ) 文字を使用して、. の特別な意味をエスケープします。 (ドット) 文字。任意の 1 文字に一致するために使用されます。 {0,2} 量指定子は、直前の文字 (この場合、[0-9] 文字クラス) が 0 回から 2 回一致する必要があることを示します。

これは、パターンが、"3.14""42.00" のように、小数点以下 2 桁までの数字のみに一致することを意味します。

比較が成功すると、if ステートメントが実行され、メッセージ "文字列は有効な 10 進数です" が出力されます。

パターン マッチングに subpatterns を使用する

パターン マッチングで使用されるもう 1つの一般的な手法は、サブパターンの使用です。 サブパターンは、括弧で囲まれたパターンの一部であり、文字をグループ化したり、入力文字列内の一致する部分文字列を参照したりするために使用できます。

たとえば、"YYYY-MM-DD" 形式の日付を含む文字列があり、文字列から年、月、日を抽出したいとします。 サブパターンを使用して、この抽出を実行できます。

my_string="2022-11-20"

if [[ $my_string =~ ^([0-9]{4})-([0-9]{2})-([0-9]{2})$ ]]; then
  year=${BASH_REMATCH[1]}
  month=${BASH_REMATCH[2]}
  day=${BASH_REMATCH[3]}

  echo "The year is: $year"
  echo "The month is: $month"
  echo "The day is: $day"
fi

出力:

The year is: 2022
The month is: 11
The day is: 20

上記のコードでは、=~ 演算子を使用して my_string 変数を ^([0-9]{4})-([0-9]{2})-([0-9]{2})$ パターン。 ^ および $ 文字は、パターンが文字列全体に一致する必要があることを示し、([0-9]{4})([0-9]{2})、および ([0-9]{2}) サブパターンは、日付の年、月、日の部分にそれぞれ一致します。

比較が成功すると、if ステートメントが実行され、入力文字列から年月日が抽出されます。 抽出された部分文字列は BASH_REMATCH 配列に格納され、インデックス 12、および 3 を使用してアクセスできます。これらはそれぞれ、1 番目、2 番目、3 番目のサブパターンに対応します。

結論として、パターン マッチングは Bash の強力な機能であり、文字列をパターンと比較して一致を見つけたり、比較の結果に基づいてアクションを実行したりできます。 これは、=~ 演算子を使用して行うことができます。この演算子は、文字列とパターンをオペランドとして取り、文字列がパターンに一致する場合に true を返します。

パターン マッチングで使用される一般的な演算子と手法には、前の文字と 0 回以上一致する * (アスタリスク) 演算子と、文字をグループ化するか、入力文字列から一致する部分文字列を抽出できるサブパターンがあります。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn