GNU sed 4.4 で確認した。
/regexp/d のデリミタ
sed '/regexp/d' で regexp にマッチする行を削除できる。
regexp を括るデリミタに / 以外を使いたい場合、最初のデリミタの前に \ をつけるとできる。
$ cat input.txt | sed -e '\%regexp%d'
s/regexp/replacement/ のデリミタ
置換コマンド s/regexp/replacemenet/ でデリミタに / 以外を使いたい場合は、\ 不要でそのまま使える。
$ cat input.txt | sed -e 's%regexp%replacement%'
違いは regexp がアドレスか、コマンドの一部か
sed スクリプトのシンタックスは次のようになる。
[addr]X[options]
X はコマンド。(e.g. d, s/regexp/replacement)
addr はアドレス。
addr が指定された場合、addr にマッチする行に対してのみ X が実行される。
addr にはいくつかの形式があり、正規表現で指定する形式として /regexp/ と \%regexp% が利用可能。(それぞれに修飾子をつけた形式もある。)
後者の \%regexp% はデリミタ % を任意の文字に置き換えて利用できる。
要するに、
/regexp/d の /regexp/ は アドレスであり、デリミタを変更したければ \%regexp% を使う必要がある。
s/regexp/replacement/ はそれ全体 s/regexp/replacement/ が置換コマンドであり、 アドレスとは異なり \ なしでデリミタを変更できる。
コマンド s/regexp/replacement/ もアドレスと組み合わせて利用可能で、 正規表現アドレスと組み合わせると次のようになる。
$ cat input.txt | sed -e '/regexp1/s/regexp2/replacement/'
/regexp1/ 部分はアドレスで、/regexp2/ はコマンドの一部なので、それぞれデリミタを変えようとすると次のようになる。
$ cat input.txt | sed -e '\%regexp1%s@regexp2@replacement@'