以前、bash の正規表現について書いた。
今回は、今更だけど、あえて、bash/zsh で使われている [[
を使わずに、正規表現を使おうとしてみた。
expr よりは bash の機能を使ったほうがいい。
以前書いた記事にある。bash/zsh の正規表現を使う方法が個人的には優れていると思う。
どうしても sh じゃないとだめなんだったときは expr を使う選択肢になる。
/bin/sh の場合は expr で正規表現を扱う。
シェルの正規表現は、次のようにかける。
expr "なにか文字列" : "regex"
または、次のように書く。
expr match "なにか文字列" "regex"
expr は expression の略だったかとおもう。Expressionの名前の通り、文字列表現の式を評価をする。四則演算なども使います。
expr を使う上での注意。
expr は式を評価するので、結果がプリントされます。
通常の [ / test
は結果をプリントせずにステータース・コードをexit code で返しますが、expr は文字列を出力するので注意。
expr で正規表現
正規表現をするときは次のように書きます。
expr hello : 'h.*o'
または
expr match hello 'h.*o'
if 文 と expr でマッチングで条件分岐
expr を正規表現マッチで返すと一致したかどうかを文字列でプリントするので、出力を捨てる必要がある。
if expr hello : 'hello' > /dev/null ; then echo match fi
サンプル
正規表現を /bin/sh で動くように regex をexpr で扱ってbashだけでなく汎ゆる場所で動くことを想定したらこんな感じになるが
#!/bin/sh match_test () { printf "%-18s:" "$1" if expr "$1" : '.*apple' > /dev/null ; then echo match else echo does not match fi } match_test "Hello World." match_test "This is an apple." match_test "This is a pen."
実行結果
上記の実行結果
$ ./test.sh Hello World. :does not match This is an apple. :match This is a pen. :does not match
細かい部分で [[ と違う。
正規表現の柔軟度を考えると、bash / zsh に組み込まれている [[
を使ったほうが正規表現の書きやすさ、マッチ判断のわかりやすさが上回っている。