ウェブサイト検索

Bashの正規表現を理解し実装する方法


目次:

  1. 紹介
  2. 数値を一致させるための正規表現
  3. 文字列を一致させるための正規表現
  4. 検索と置換のための正規表現
  5. ファイル内のコンテンツを検索するための正規表現
  6. ファイルの内容を変更するための正規表現
  7. メールアドレスを検証するための正規表現
  8. 電話番号を検証するための正規表現
  9. ユーザー名とパスワードを検証するための正規表現

紹介

文字列を一致させたり検索したり置換したりするための正規表現パターンで一般的に使用される特殊文字のいくつかは、以下に示されています:

キャラクター目的
.
改行を除く任意の文字を検索するために使用されます。
^
テキストの先頭で検索するために使用されます。
$
テキストの最後を検索するために使用されます。
\b
それはバックスペース文字を検索するために使用されます。
\n
それは改行文字を検索するために使用されます。
\t
それはタブ文字を検索するために使用されます。
\r
キャリッジリターン文字を検索するために使用されます。
\d
それは数字文字を検索するために使用されます。
\D
それは非数字文字を検索するために使用されます。
\s
それは空白文字を検索するために使用されます。
\S
空白以外の文字を検索するために使用されます。

異なる種類の文字範囲を検索するために使用される、一般的に使用される正規表現パターンが以下に示されています。

範囲目的
[a-z]
すべての小文字のアルファベット文字を検索するために使用されます。
[A-Z]
すべての大文字のアルファベット文字を検索するために使用されます。
[0-9]
すべての数値文字を検索するために使用されます。
[a-zA-Z]
それはすべてのアルファベット文字を検索するために使用されます。
[0-9a-zA-Z]
それはすべての英数字を検索するために使用されます。
[^A-Z]
大文字以外のすべての文字を検索するために使用されます。
[^0-9]
数値以外のすべての文字を検索するために使用されます。

数字を一致させるための正規表現

[0-9] 表現の使用は、入力値が数字かどうかを確認するために以下のスクリプトに示されています。ユーザーから取得した入力が数字であれば、成功のメッセージが表示されます。そうでなければ、エラーメッセージが表示されます。

#!/bin/bash

#Take input from the user

read -p "Enter your age: " age

#Check whether the input value is valid or invalid

if [[ $age =~ [0-9] ]]; then

#Print message for the valid data

echo "$age is valid age value."

else

#Print message for the invalid data

echo "Input value must be a number."

fi

次の出力は、入力値70でスクリプトを実行した後に表示されます:

次の出力は、「test」という入力値でスクリプトを実行した後に表示されます:

文字列に対する正規表現

[a-zA-Z]の表現の使用は、入力値がすべてのアルファベット文字を含むかどうかを確認するために、以下のスクリプトに示されています。ユーザーから取得した入力にすべてのアルファベット文字が含まれている場合、成功値が印刷されます。それ以外の場合は、エラーメッセージが印刷されます。

#!/bin/bash

#Take input from the user

read -p "Enter the book name: " bname

#Check whether the input value is valid or invalid

if [[ $bname =~ [a-zA-z] ]]

then

#Print message for the valid data

echo "$bname is valid data."

else

#Print message for the invalid data

echo "Input value must be a string."

fi

次の出力は、「シェルプログラミング」という値でスクリプトを実行した後に表示されます:

スクリプトを230の値で実行した後に次の出力が表示されます:

文字列の検索と置換のための正規表現

以下のスクリプトは、特定の文字列の部分を検索して置換するための正規表現パターンの使用を示しています。ユーザーから文字列の値を取得します。入力された文字列に「a」から「m」までのいずれかの文字が含まれている場合、それらの文字は「_」という文字に置き換えられます。「/[a-m]/」パターンがスクリプト内でキャラクターを検索するために使用されます。その後、元の文字列と置換された文字列の両方が出力に印刷されます。

#!/bin/bash

#Take input from the user

read -p "Enter a string value: " Str

#Modify the string based on the pattern

modified_Str=${Str//[a-m]/_}

#Print the main string value

echo "The original string is $Str"

#Print the replaced string value

echo "The modified string is $modified_Str"

スクリプトを「hello」という入力値で実行した後、以下の出力が表示されます。ここでは、文字列の4文字が「_」文字で置き換えられています。置き換えられた文字列は「____o」です:

「Zoo」という入力値でスクリプトを実行した後に次の出力が表示されます。入力値に一致する文字は見つかりませんでした。したがって、元の文字列は変更されませんでした。

ファイル内のコンテンツを検索するための正規表現

この例のスクリプトを確認する前に、次の内容を含む「products.txt」という名前のテキストファイルを作成してください。

products.txt

ID Name Price

1090 Monitor 50

2378 Mouse 10

4521 Printer 100

5682 Keyboard 25

「grep」コマンドは、ターミナルからBashでファイル内の特定の文字列を検索するためのオプションの一つです。以下の「grep」コマンドは、「products.txt」ファイルの中で「00」で終わる行を検索します。

grep '00$' products.txt

「grep」コマンドを実行した後、以下の出力が表示されます。パターンに一致する行がファイルに存在し、その行が出力に印刷されます:

Bashスクリプトで正規表現を使用してファイルから特定の行を検索する方法は、以下のスクリプトに示されています。ファイル名はコマンドライン引数の値から取得され、ファイルの内容は「while」ループを使用して、「L」から「M」までのいずれかの文字を含む行がある場合に読み取られます。その後、その行が出力に印刷されます。

#!/bin/bash

#Read the file line by line

while read -r line

do

#Search the lines that contain the characters between 'L' to 'M'

if [[ $line =~ [L-M] ]]

then

#Print the matching line

echo $line

fi

#Read the file that is passed in the first argument

done < $1

スクリプトを「products.txt」ファイルという引数値で実行した後、次の出力が表示されます。このファイルには、パターンに一致する2行が含まれています:

ファイルの内容を修正するための正規表現

Bashにはファイルの内容を検索し置換するための複数のコマンドが存在します。その中の一つが「sed」コマンドです。以下のスクリプトは、コマンドライン引数からファイル名を取得します。「search」文字列と「replace」文字列はユーザーから取得します。入力値が空でなく、コマンドライン引数として渡されたファイル名が検索ワードに一致する文字列を含む場合、一致する文字列は「replace」文字列に置換されます。このスクリプトでは「sed」コマンドと「-i」オプション、検索および置換パターンを使用してファイルの内容を修正します。

#!/bin/bash

#Read the filename

filename=$1

#Take the string for searching

read -p "Enter the search string: " src

#Take the string for replacing

read -p "Enter the replace string: " rep

if [[ ! -z $src && ! -z $rep ]];

then

#Search and replace the string in the file

sed -i "s/$src/$rep/" $filename

fi

次のコマンドを実行して「products.txt」ファイルの内容を確認してください。出力によると、ファイルには5行の内容が含まれています:

cat products.txt

次のコマンドを実行して、以前に作成された「products.txt」ファイルを最初のコマンドライン引数としてスクリプトを実行してください。出力によると、「keyboard」が検索文字列として、そして「scanner」が置換文字列として使用されます。「search」文字列は「products.txt」ファイルに存在します。したがって、ファイルの内容が変更されます。

次に、前の「cat」コマンドを再度実行して「products.txt」ファイルの内容を確認します。出力によれば、「keyboard」という言葉は「Scanner」という言葉に置き換えられています。

メールアドレスを検証するための正規表現

正規表現を使用する主な目的の一つは、データを検証することです。正規表現パターンの非常に簡単な使用法は、前の例に示されています。パターンの複雑さは、検証の種類に基づいて増加します。メールアドレスを検証するためには、長い正規表現パターンを書く必要があります。以下のスクリプトは、正規表現パターンを使用してメールアドレスを検証する方法を示しています。メールアドレスは複数の部分で構成されています。最初の部分には、任意の英数字、ドット(.)、アンダースコア(_)、ハイフン(-)を含む可能性があるユーザー名が含まれています。次に、メールの中で「@」が使用されます。メールの最後の部分には、2文字から4文字で終わることができるドメイン名が含まれています。スクリプトによれば、ユーザーから取得されたメールアドレスが正規表現パターンで有効か無効かを確認します。

#!/bin/bash

#Take an email address from the user

read -p "Enter your email address: " em

#Check whether the email address is valid or invalid

if [[ "$em" =~ ^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]

then

#Print message for the valid email address

printf "%s is a valid email address.\n" $em

else

#Print message for the invalid email address

printf "%s is an invalid email address.\n" $em

fi

以下の出力は、“[email ” が有効なメールアドレスであることを示しています。なぜなら、与えられた正規表現パターンと一致したときに、“if”文が真を返すからです。

以下の出力は、「[email 」が無効なメールアドレスであることを示しています。なぜなら、「if」ステートメントが指定された正規表現パターンと一致したときに偽を返すからです。

電話番号を検証するための正規表現

電話番号を「880-XXX-XXX-XXXX」形式で検証する方法が次のスクリプトに示されています。ここで「X」は任意の数字を示します。電話番号はユーザーから取得されます。このスクリプトに従って、ユーザーから取得した電話番号が有効か無効かを正規表現パターンを使って確認します。

#!/bin/bash

#Take a phone number from the user

read -p "Enter your phone number: " phone

#Check whether the phone number is valid or invalid

if [[ "$phone" =~ ^880-[0-9]{3}\-[0-9]{3}\-[0-9]{4}$ ]]

then

#Print a message for the valid phone number

printf "%s is a valid phone number.\n" $phone

else

#Print a message for the invalid phone number

printf "%s is an invalid phone number.\n" $phone

fi

以下の出力は、「880-169-345-7840」が入力された電話番号が正規表現パターンと一致するため、有効な電話番号であることを示しています。

次の出力は「880-176-6789-89」が無効な電話番号であることを示しています。なぜなら、入力された電話番号が正規表現パターンと一致しないからです。

ユーザー名とパスワードの検証用正規表現

ユーザー名とパスワードの値を検証する方法は、以下のスクリプトに示されています。このスクリプトによると、ユーザー名は小文字のアルファベットと数字のみを含むことができ、ユーザー名の長さは6から10文字でなければなりません。パスワードは、任意の英数字、“$ ”、“# ”、“@ ”、“_ ”、および“-“の文字のみを含むことができ、パスワードの長さは5から8文字でなければなりません。

#!/bin/bash

#Take username and password

read -p "Enter username: " un

read -p "Enter username: " pw

#Check whether the username and password is valid or invalid

if [[ "$un" =~ [a-z0-9]{6,10} && "$pw" =~ [a-zA-Z0-9#$@_-]{5,8} ]]

then

#Print a message when both input values are valid

echo "Username and password are valid."

else

#Print a message if any of the input value is invalid

echo "Username or password are invalid."

fi

次の出力は、ユーザー名「fahmida19」とパスワード「hello@123」を入力値としてスクリプトを実行した後に表示されます:

結論

このチュートリアルでは、複数のBashコマンドとスクリプトを使用して、正規表現パターンのさまざまな使用法が示されています。単純な正規表現パターンから複雑なものを使用してデータを検索、置換、および検証する方法がここに示されています。