[Bash]正規表現マッチした部分文字列を再利用する方法

Bashでは正規表現マッチを使ってマッチした部分文字列を再利用することができます。
つまり文字列の加工を自由自在にすることができます。

例:"foo_bar"から"foo"や"bar"を取り出したい

 [[ "foo_bar" =~ ^(*)_(*)$ ]]
ここでマッチした部分文字列は、BASH_REMATCHという配列に格納されています。
# マッチした全体を参照したい場合

TOTAL=${BASH_REMATCH[0]}
echo $TOTAL  #  => foo_bar

# ()でマッチした部分文字列を取り出したい場合

LEFT=${BASH_REMATCH[1]}
echo $LEFT   # => foo
シェルスクリプトで書くなら下記ような感じで。
#!/bin/bash

if [[ "foo_bar" =~ ^(.+)_(.+)$ ]] ; then
  echo ${BASH_REMATCH[0]}  #  => foo_bar
  echo ${BASH_REMATCH[1]}  #  => foo
  echo ${BASH_REMATCH[2]}  #  => bar
fi
こんな感じで、sedやawkやperlを使わなくてもbashだけで文字列の加工をすることができます。
どいういうときに便利かというと、例えば大量のファイルを一括でリネームしたいときに役にたちます。

ぜひ一度お試しあれ。
カテゴリ: