sed 削除コマンドの正規表現デリミタに / 以外を使う


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@'

参考