web-dev-qa-db-ja.com

sedで使用できる区切り文字は何ですか?

sed区切り文字を含むパターンを使用したい場合、sedの_unknown option to s'_エラーについて不平を言う人がよくいます。

たとえば、_/_を使用している場合:

_$ var="hel/lo"
$ sed "s/a/$var/g" <<< "haha"
sed: -e expression #1, char 9: unknown option to `s'
_

したがって、_|_などの別の区切り文字を使用することをお勧めします。

_$ sed "s|a|$var|g" <<< "haha"
hhel/lohhel/lo
_

ただし、sedが受け入れることができる区切り文字は何であるかを知りたい...正規表現のようなもの(_*_、_?_、_._、...)!

私のsed (GNU sed) 4.2.2

_$ sed 's/a/b/g' <<< "haha"
hbhb
$ sed 's_a_b_g' <<< "haha"
hbhb
$ sed 's#a#b#g' <<< "haha"
hbhb
$ sed 's$a$b$g' <<< "haha"
hbhb
$ sed 's?a?b?g' <<< "haha"
hbhb
$ sed 's*a*b*g' <<< "haha"
hbhb
$ sed 's-a-b-g' <<< "haha"
hbhb
$ sed 's.a.b.g' <<< "haha"
hbhb
$ sed 'sXaXbXg' <<< "haha"
hbhb
$ sed 'sxaxbxg' <<< "haha"
hbhb
$ sed 's1a1b1g' <<< "haha"
hbhb
_

エスケープされていれば、aでも機能します。

_$ sed 'saaabag' <<< "haha"
sed: -e expression #1, char 5: unknown option to `s'
$ sed 'sa\aabag' <<< "haha"
hbhb
_

これの仕様はありますか?

おそらく標準に最も近いPOSIX/IEEE Open Group Base Specification says

[2addr] s/BRE/replacement/flags

パターンスペース内のBREのインスタンスを置換文字列に置き換えます。 BREと置換を区切るために、スラッシュの代わりにバックスラッシュまたは改行以外の文字を使用できます。 BREおよび置換内では、BREデリミタ自体の前にバックスラッシュが付いている場合、それ自体をリテラル文字として使用できます。

17
JCx