grepによる正規表現と’-E’をつけた拡張正規表現の違い(and sed)

Pocket

grep (GNU grep) 2.5.1を使って確認しました。
今日、上司に訊かれたのですが/etc/pam.d/su

#auth            required        pam_wheel.so use_uid

の行のコメントをどうやってsedの正規表現を使って外すかということでした。

私はPerlやRubyの正規表現と同じ感覚で以下のように答えました。

# sed -i 's/^#(auth[ t]+required)/$1/g' /etc/pam.d/su

はい、全く置換してくれませんでした(ちなみに-iオプションは上書きモードの意味です)。
何度も何度もちょこちょこ修正してやっては見たのですがどうしてもマッチしてくれない・・・。
なんとなくマッチしたところで妥協するしかありませんでした。

マッチした正規表現

もう少し試してみたらやっとマッチする正規表現が見つかりました。

POSIX互換タイプの正規表現

# cat /etc/pam.d/su | grep 'auth[[:blank:]]+required'

拡張正規表現モードの正規表現

-E は拡張正規表現モードで起動することを意味します。

# cat /etc/pam.d/su | grep -E 'auth[[:blank:]]+required'

おわかりいただけるでしょうか?
"+""+" の違いと、集合セットをさらにブラケット [] で囲まなければいけなかったのです。

正解

とういうことで、sedはPOSIX互換の正規表現を受け付けるため

# sed -i 's/^#(auth[[:blank:]]+required)/1/g' /etc/pam.d/su

でした。POSIX互換の正規表現では後方参照系はバックスラッシュでエスケープしなければいけないのと、 "$1" ではなく "1" としなければいけないところもポイントでした。

正規表現は本当に方言が多いですね・・・。

参考

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください