1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?