sedコマンド 正規表現 +の扱い


sed コマンドで以下が動きません。  
環境: Mac OS X の Yosemite  
目的: `hello` から先を `X` に置き換え、`helloX` を得たい。

[code]

    echo "helloddkkdddd" | sed -e "s/hello.\+/X/g"
    
[/code]

よろしくお願いします。




グループ化をつかって以下の様に

[code]

    echo "helloddkkdddd" | sed -e "s/\(hello\).\+/\1X/g"
    
[/code]

とすれば

[code]

    helloX
    
[/code]

となります。

簡単な説明としては

`\\(...\\)`で括られた部分がグループとして扱われ、`\1` を使って最初に登場したグループのマッチ結果を出力することができます。




Macのsedだと+が使えないか、別の表現が必要なようです。

[code]

    $ echo "helloddkkdddd" | gsed -e "s/hello..*/X/g"
    X
    
[/code]

とやるか、brewをお使いでしたら、

[code]

    $ brew install coreutils
    
[/code]

としてGNUのsed（gsed）をインストールすると+が使えます。

[code]

    $ echo "helloddkkdddd" | gsed -e "s/hello.\+/X/g"
    X
    
[/code]

-r オプションを指定すれば、バックスラッシュでエスケープする必要はありません。
[code]

    $ echo "helloddkkdddd" | gsed -r -e "s/hello.+/X/g"
    X
    
[/code]

出力が

[code]

    $ echo "helloddkkdddd" | sed 
    helloxxxxxxxx
    
[/code]

というものなら、ちょっと悩みますが、とりあえずawkを使うズルを一つ提示しておきます。

[code]

    $ echo "helloddkkdddd" | sed 's/hello\(.*\)/hello \1/' | awk '{gsub(/./,"X",$2);print}' | sed 's/ //'
    helloXXXXXXXX
    
[/code]

