Linux‎ > ‎

sed/grepコマンドの正規表現

sed/grepコマンドでオプション無しで実行した場合、いくつかの正規表現演算子は、(特別に)エスケープが必要になります。エスケープが必要な正規表現演算子は「+」「?」「{」「}」「(」「)」「|」の7つです。ただし、拡張正規表現を使うオプションを指定すればエスケープは必要なくなります。

sed/grepコマンドの正規表現では「基本正規表現」と「拡張正規表現」があります。基本正規表現と拡張正規表現の違いは、「+」「?」「{」「}」「(」「)」「|」の7つの正規表現演算子にエスケープが必要かどうかだけです。それだけの「拡張」ということです。※私は、もっと何かいろいろ変わっているのかと思っていました。

よく使いそうなtrimについて例を挙げます。
# 先頭・末尾の空白の連続を削除
# こう「\」が多いと分かりづらく間違えやすい
VALS=`echo ${RESULT} | sed 's/\(^ \+\| \+$\)//g'`

# 「-r」オプションをつけて拡張正規表現を使えばこんなにすっきり
VALS=`echo ${RESULT} | sed -r 's/(^ +| +$)//g'`

歴史的な経緯から厳密には、「ピュアな基本正規表現」と「GNU拡張した基本正規表現」があり、7つの正規表現演算子以外にも差異があるのですが、私が試したバージョン「GNU sed 4.1.5版」では「ピュアな基本正規表現」を使うよう強制するオプション(--posix)をつけても何も変わらなかった為、比較的新しいバージョンでは同じ実装にしているのだと思います。よってこのページでは「GNU拡張した基本正規表現」を「基本正規表現」と呼び、また「ピュアな基本正規表現」については説明を割愛します。

種類 コマンド 説明
(ピュアな)基本正規表現 なし? Basic Regular Expression (BRE)。使われていないかも。
基本正規表現 sed, sed --posix, grep BREをGNU拡張したもの。オプション無しだとこれになる。7つの正規表現演算子でエスケープが必要になる。
拡張正規表現 sed -r, grep -E, egrep Extended Reuglar Exression (ERE)。7つの正規表現演算子がエスケープ無しで使える


基本正規表現・拡張正規表現で使える正規表現をまとめておきます。

基本正規表現 拡張正規表現
* *
\+ +
\? ?
\{n,m\} {n,m}
\{n,\} {n,}
\{n\} {n}
\(regexp\) (regexp)
\| |
. .
^ ^
$ $
\1 \2 \3 \4 \5 \6 \7 \8 \9 \1 \2 \3 \4 \5 \6 \7 \8 \9
[char-list] [char-list]
[:alnum:] [:alnum:]
[:alpha:] [:alpha:]
[:blank:] [:blank:]
[:cntrl:] [:cntrl:]
[:digit:] [:digit:]
[:graph:] [:graph:]
[:lower:] [:lower:]
[:print:] [:print:]
[:punct:] [:punct:]
[:space:] [:space:]
[:upper:] [:upper:]
[:xdigit:] [:xdigit:]
\b \b
\B \B
\< \<
\> \>
\w \w
\W \W

※Perl正規表現で定義されている「\d」などは、拡張正規表現でも使えません。
※『[:digit:]』などを使いたいときには、実際には『[[:digit:]]』と表記します。これを忘れると『:digit:』の中のどれかの文字』という意味になってしまいます。

参考サイト

2011/09/06