問題
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"