web-dev-qa-db-ja.com

bashのif条件で正規表現を使用する

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つが一致しないのはなぜですか?

この例だけでなく、できるだけ多くの一般的なルールを指定できることを願っています。

84
Tim

Globパターンを使用する場合、疑問符は単一の文字を表し、アスタリスクは0個以上の文字のシーケンスを表します。

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

正規表現を使用する場合、ドットは単一の文字を表し、アスタリスクは先行する文字のゼロ個以上を表します。したがって、「.*」は任意の文字のゼロ以上を表し、「a*」はゼロ以上の「a」を表し、「[0-9]*」はゼロ以上の数字を表します。もう1つの有用な(多くの)ものは、1つ以上の先行文字を表すプラス記号です。したがって、「[a-z]+」は、1つ以上の小文字のアルファ文字を表します(Cロケールおよびその他の一部)。

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

=〜を使用

正規表現チェック用 正規表現チュートリアル目次

35
Enrico Carlesso
if [[ $gg =~ ^....grid.* ]]

このソリューションにgrepおよび基本的なshビルトインを追加して、よりポータブルなソリューション(bashバージョンに依存せず、Linux以外の古いshでも動作します。プラットフォームなど)

# GLOB matching
gg=svm-grid-ch    
case "$gg" in
   *grid*) echo $gg ;;
esac

# REGEXP    
if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi    

# Extended REGEXP
if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then
  echo $gg
fi    

一部のgrepインカネーションは、-qへのリダイレクトの代替として/dev/null(静か)オプションもサポートしますが、リダイレクトは最も移植性が高くなります。

7
vladr