1. ホーム
  2. regex

[解決済み] bash の if 条件で正規表現を使用する。

2023-03-15 16:23:59

質問

bashでif節に正規表現を使うのは一般的なルールなんでしょうか?

以下はその例です。

$ gg=svm-grid-ch  
$ if [[ $gg == *grid* ]] ; then echo $gg; fi  
svm-grid-ch  
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi  
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi  
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi  
$   

なぜ最後の3つはマッチングに失敗するのでしょうか?

この例だけでなく、できるだけ多くの一般的なルールを教えていただけると幸いです。

どのように解決するのですか?

グロブパターンを使用する場合、クエスチョンマークは1文字、アスタリスクは0文字以上の連続を表します。

if [[ $gg == ????grid* ]] ; then echo $gg; fi

正規表現を使う場合、ドットは1つの文字を表し、アスタリスクは直前の文字の0個以上を表します。つまり、"。 .* は任意の文字の0個以上を表し、" a* "は0個以上の"、".を表します。 [0-9]* は0桁以上の数字を表します。もう1つ便利なのがプラス記号で、これは直前の文字の1つ以上を表します。つまり、" [a-z]+ は1つ以上の小文字のアルファ文字を表します(Cロケール、および他のいくつかのロケール)。

if [[ $gg =~ ^....grid.*$ ]] ; then echo $gg; fi