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拡張した基本正規表現」を「基本正規表現」と呼び、また「ピュアな基本正規表現」については説明を割愛します。
基本正規表現・拡張正規表現で使える正規表現をまとめておきます。
※Perl正規表現で定義されている「\d」などは、拡張正規表現でも使えません。
※『[:digit:]』などを使いたいときには、実際には『[[:digit:]]』と表記します。これを忘れると『:digit:』の中のどれかの文字』という意味になってしまいます。
参考サイト
2011/09/06
|
Linux >