你可以在sed中使用哪些分隔符?

时间:2015-11-25 10:41:36

标签: sed gnu delimiter

我们通常会看到有人抱怨unknown option to s'中的sed错误,因为他们想要使用包含sed分隔符的模式。

例如,如果我们使用/

$ 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 也适用:

{{1}}

这有什么规格吗?

1 个答案:

答案 0 :(得分:11)

可能是最接近标准的POSIX / IEEE Open Group Base Specification says

  

[2addr] s / BRE / replacement / flags

     

用替换字符串替换BRE中的BRE实例   模式空间。 反斜杠或换行符以外的任何字符都可以   用来代替斜线来划定BRE和替换。   在BRE和替换中,BRE分隔符本身可以   如果前面有反斜杠,则用作文字字符。&#34;