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

fed*_*qui 15 gnu sed 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'
Run Code Online (Sandbox Code Playgroud)

所以我们建议使用另一个分隔符,例如|:

$ sed "s|a|$var|g" <<< "haha"
hhel/lohhel/lo
Run Code Online (Sandbox Code Playgroud)

不过,我想知道什么是可能的分隔符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
Run Code Online (Sandbox Code Playgroud)

a如果它被转义,甚至可以在这里工作:

$ sed 'saaabag' <<< "haha"
sed: -e expression #1, char 5: unknown option to `s'
$ sed 'sa\aabag' <<< "haha"
hbhb
Run Code Online (Sandbox Code Playgroud)

这有什么规格吗?

JCx*_*JCx 18

也许最接近标准的POSIX/IEEE Open Group Base规范:

[2addr] s/BRE/replacement/flags

将替换字符串替换为模式空间中BRE的实例.可以使用除反斜杠或换行符之外的任何字符而不是斜杠来分隔BRE和替换.在BRE和替换中,如果BRE分隔符前面有反斜杠,则它可以用作文字字符."

  • 请注意,它必须是单字节字符。 (7认同)