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つが一致しないのはなぜですか?
この例だけでなく、できるだけ多くの一般的なルールを指定できることを願っています。
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
=〜を使用
正規表現チェック用 正規表現チュートリアル目次
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
(静か)オプションもサポートしますが、リダイレクトは最も移植性が高くなります。