LoginSignup
27
18

More than 5 years have passed since last update.

sedの正規表現のデリミタに、/ 以外を使用する

Last updated at Posted at 2014-12-27

問題

sedでファイル名置換を行う場合などに、パスのデリミタ「/」のエスケープが大量に発生して正規表現が大変読みづらくなる傾向があります。

s/\\/usr\\/bin/\\/usr\\/local\\/bin/g
's/\/usr\/bin/\/usr\/local\/bin/g'

実行例:

mbp15:~$ echo /usr/bin/php | sed -e s/\\/usr\\/bin/\\/usr\\/local\\/bin/g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e 's/\/usr\/bin/\/usr\/local\/bin/g'
/usr/local/bin/php

解決

このような場合、正規表現のデリミタを別の文字に変えてやることで読みやすい正規表現を書くことができます。

カンマやコロンなど、色々な文字を使用できます。

mbp15:~$ echo /usr/bin/php | sed -e s,/usr/bin,/usr/local/bin,g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s:/usr/bin:/usr/local/bin:g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s#/usr/bin#/usr/local/bin#g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s@/usr/bin@/usr/local/bin@g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s%/usr/bin%/usr/local/bin%g
/usr/local/bin/php

使用する文字は、基本的にコンテンツとかぶらないものを使用しますが、迷った場合はスペースなんかおすすめです。

mbp15:~$ echo /usr/bin/php | sed -e 's /usr/bin /usr/local/bin g'
/usr/local/bin/php

ちなみにバックスラッシュなど、使用できない文字もあります。

mbp15:~$ echo /usr/bin/php | sed -e 's\/usr/bin\/usr/local/bin\g'
sed: 1: "s\/usr/bin\/usr/local/b ...": substitute pattern can not be delimited by newline or backslash

他の言語では

例えば Ruby では、%r記法で似たような正規表現リテラルが作成できます。

$ irb
irb(main):001:0> "/usr/bin/php".sub %r|/usr|, '/usr/local'
=> "/usr/local/bin/php"
27
18
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
27
18