揮発性のメモ2

知識をメモ書きしておく

bashで、正規表現を使うときにやる失敗

正規表現を "" などで囲わない

""で囲うと正規表現で無くなるっぽい

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