[[コマンドの正規表現(後方参照と文字クラス)

目次

bash の[[コマンドでは正規表現を使用できる。正規表現にマッチした部分は後方参照できる。正規表現には POSIX 形式の文字クラスを指定できる。

[[コマンド

[[コマンドは、多くの場合 if と組み合わせて条件判断に使用されます。この[[コマンドは、[コマンドのただ等しい・大小比較だけではなく=~で正規表現にマッチするか調べられます。

$ [[ "abcdefg" =~ ^abc ]] && echo TRUE
TRUE

正規表現の後方参照

正規表現にマッチした部分は、変数 BASH_REMATCH に代入されます。

$ [[ "a1234b" =~ [0-9]+ ]] && echo ${BASH_REMATCH}
1234

変数 BASH_REMATCH は配列変数で、添字を指定することで対応する括弧の部分を取り出すことが可能です。

$ [[ "a1234b" =~ a([0-9]+)([a-z]) ]] && echo ${BASH_REMATCH[@]}
a1234b 1234 b

正規表現に文字クラスを使う

正規表現には、文字クラスも使用可能です。ただし次のような制限があります。

  • 文字クラスは選択[]内でのみ使用できる。

  • Perl 系の表記方法(例えば数字を表す\d)を使用できない。代わりに POSIX の表記方法(数字であれば[:digit:])を使用する。

    $ [[“a1234b” =~ a[:digit:]+b]] || echo FALSE FALSE $ [[“a1234b” =~ a[[:digit:]]+b ]] && echo TRUE TRUE $ [[“a1x2y34b” =~ a([[:digit:]xy]+)]] && echo ${BASH_REMATCH1} 1x2y34

POSIX の主な文字クラスは次のようになります。

文字クラス Perl 系 意味
[:digit:] \d 数字
[:xdigit:] \h(Ruby) 16 進数での数字
[:alnum:] \w(\w は_を含む) アルファベットと数字
[:space:] \s 改行を含む空白

参照