正規表現を "" などで囲わない
""で囲うと正規表現で無くなるっぽい
A="abcdefg" # OK [[ $A =~ (abc) ]] && echo ${BASH_REMATCH[1]} # abc # NG [[ $A =~ "(abc)" ]] && echo ${BASH_REMATCH[1]} # エラーは出ないが結果も出ない
空白を検索できない
空白はエスケープの必要がある。ただし、括弧の中では平気なの
A="abc defg" # OK [[ $A =~ abc\ (.*) ]] && echo ${BASH_REMATCH[1]} # defg # エラー [[ $A =~ abc (.*) ]] && echo ${BASH_REMATCH[1]} -bash: syntax error in conditional expression: unexpected token `(' -bash: syntax error near `(.' # OK [[ $A =~ (c .*) ]] && echo ${BASH_REMATCH[1]} # c defg
ホワイトスペースを判定できない
タブコードとかを判定するのにコツがいる。 [^\S] という信じられないほど回りくどい方法
A="abc"$'\t'"defg" # $'\t' でタブコードが表現できる # OK(ホワイトスペースではない文字ではない文字) [[ $A =~ abc[^\S](.*) ]] && echo ${BASH_REMATCH[1]} # defg # OK(タブコードを直接) [[ $A =~ abc$'\t'(.*) ]] && echo ${BASH_REMATCH[1]} # defg # NG [[ $A =~ abc\s(.*) ]] && echo ${BASH_REMATCH[1]} # NG [[ $A =~ abc[\s](.*) ]] && echo ${BASH_REMATCH[1]}
参考:
bashの正規表現でスペース(空白)を判定する方法: 小粋空間
bashで変数にタブコードを入れる - 揮発性のメモ2
最短マッチしない
これはどうにも回避できないし動きが予測不能。なんだこれ。そもそも最短マッチ機能が存在しないのか? perlならちゃんと意図したとおりになる
A="abcdefg hijk" # abcで始まる文字列から、最後の英字(hijk)を取り出したい # 空白は英字じゃないのでその後ろからかな # 一応読み飛ばした分も取得する # NG [[ $A =~ ^abc(.+?)([a-z]+)$ ]] && echo ${BASH_REMATCH[1]},${BASH_REMATCH[2]} # defg hij,k # 理想 echo "abcdefg hijk" | perl -ne '/^abc(.+?)([a-z]+)$/; print "$1,$2\n"' # defg ,hijk