CentOSで複数ファイル内文字列の一括置換をしたいのですが、うまくいきません…


**置換前**  
・hoge.jp/stackoverflow

* * *

**置換後**  
・piyo/hoge.jp

* * *

**試したけれどもうまくいかなかったコード**

[code]

    find /path -type f | xargs sed -i 's/hoge.jp%stackoverflow/piyo&hoge.jp/g'
    
[/code]

・意味は良く分かっていません  
・区切りに/が入るとエラーになるとネットに書いてあってので、%で区切っています

* * *

**質問**  
・何がマズいのでしょうか？



[code]

    find /path -type f | xargs sed -i 's%hoge\.jp/stackoverflow%piyo/hoge.jp%g'
    
[/code]

とします。

* * *
[code]

    sed -i 's/hoge.jp%stackoverflow/piyo&hoge.jp/g'
    
[/code]

この様に書いてしまいますと、以下の変換を行います。

[code]

    hoge.jp%stackoverflow  =>  piyo&hoge.jp
    
[/code]

sed の `s` コマンドでは、`s` の次の文字がセパレータとして認識されます。このセパレータ文字は `s`
コマンドに指定する正規表現文字列と変換先文字列に含まれない文字であれば使用可能です。ですので、以下は全て同じ変換になります。

[code]

    s%hoge\.jp/stackoverflow%piyo/hoge.jp%g  ## %
    s@hoge\.jp/stackoverflow@piyo/hoge.jp@g  ## @
    s:hoge\.jp/stackoverflow:piyo/hoge.jp:g  ## :
    s_hoge\.jp/stackoverflow_piyo/hoge.jp_g  ## _
    sZhoge\.jp/stackoverflowZpiyo/hoge.jpZg  ## Z
    
[/code]

なお、`.` が任意の一文字にマッチする正規表現なので `\` でエスケープします(`hoge.jp/stackoverflow` 内の `.` のみ)。



[code]

    find /path -type f | xargs sed -i 's%hoge\.jp/stackoverflow%piyo/hoge.jp%g'
    
[/code]

とします。

* * *
[code]

    sed -i 's/hoge.jp%stackoverflow/piyo&hoge.jp/g'
    
[/code]

この様に書いてしまいますと、以下の変換を行います。

[code]

    hoge.jp%stackoverflow  =>  piyo&hoge.jp
    
[/code]

sed の `s` コマンドでは、`s` の次の文字がセパレータとして認識されます。このセパレータ文字は `s`
コマンドに指定する正規表現文字列と変換先文字列に含まれない文字であれば使用可能です。ですので、以下は全て同じ変換になります。

[code]

    s%hoge\.jp/stackoverflow%piyo/hoge.jp%g  ## %
    s@hoge\.jp/stackoverflow@piyo/hoge.jp@g  ## @
    s:hoge\.jp/stackoverflow:piyo/hoge.jp:g  ## :
    s_hoge\.jp/stackoverflow_piyo/hoge.jp_g  ## _
    sZhoge\.jp/stackoverflowZpiyo/hoge.jpZg  ## Z
    
[/code]

なお、`.` が任意の一文字にマッチする正規表現なので `\` でエスケープします(`hoge.jp/stackoverflow` 内の `.` のみ)。

