それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの正規表現マッチで後方参照

bash正規表現マッチで後方参照。

bash[[ コマンドで、正規表現マッチが使える話は以前書きました。

そのときには、意図的に書きませんでしたが、bash正規表現マッチでは後方参照が使えます。bash rematch の変数に格納されます。

ちなみに、rematchは re:match ではなく、regex matchのre だと思います。

bash正規表現マッチと後方参照

とりあえず、動作例を見てください。

takuya@:~$ [[ takuya =~ taku(.+) ]]
takuya@:~$ echo ${BASH_REMATCH[@]}
takuya ya

後方参照は、BASH_REMATCH

BASH_REMATCH の変数に、配列で返ってきます。コレだけ覚えておけば十分。

配列は、 BASH_REMATCH[0] がマッチ全体で、BASH_REMATCH[n] が後方参照にマッチをした箇所

後方参照は意外に使える。

正規表現マッチだけじゃなく、後方参照で文字列を抜き出すのは意外に使えると思います。

[[ $name =~  $regex ]]
if [[ -v BASH_REMATCH[1] ]]  ; then 
  echo ${BASH_REMATCH[1]}
  str=${BASH_REMATCH[1]} 
if 

などとして、正規表現マッチを使って文字列を抜き出したり加工したり出来るのは重宝しそうですね。

なので、extglobの正規表現っぽい glob パターン を使うのは避け、正規表現をガンガン使ったほうがマシなのではないでしょうか。

extglob でも十分かもしれませんが、extglob はon/off が設定環境依存になるのに対し、正規表現は設定無しでいけます。

grep正規表現で後方参照したくてもできないときに活用してはいかがでしょうか。

参考資料