sedで特定の文字列が含まれているときに変換をしない

こんな注文。ある文書中の文字列を削除したい。しかし、特定文字列が含まれている行の場合は削除はしたくない。ちなみに、実現方法はsed限定。apacheのmod_sedなので。

href="https://www.example.com/hogefuga" → href="/hogefuga"

としたいけど、

<link ref="cannonical" href="https://www.example.com/hogefuga"

という行はなにもしない。どうする。

削除するスクリプト

はこんな感じ。実際にはドメイン名のところは汎用的な正規表現になってたりしますが。

s/\(href="\)https:\/\/www.example.com/\1/

正規表現でなんとかなるかな

否定の先読みで正規表現でマッチさせれば。

s/\((?! ref="cannonical") href="\)https:\/\/www.example.com/\1/g

うーん、うまくいかない。難しいなぁ。

スキップさせればいいのか

そういや分岐って手があった。特定文字列にマッチしたら処理を分岐させてスクリプトをnopにすればいいんだ。

/rel=\"cannonical/b
s/\(href="\)https:\/\/www.example.com/\1/

bは任意のラベルへの分岐。ラベル指定を省略するとスクリプトの最後へジャンプします。つまり何もしないで終了。
これでうまくいきました。sedって高機能。