为什么我不能转义 sed 中的大括号“]”?

Lou*_*e79 6 sed quoting regular-expression

问题:为什么我不能转义“]”?

$ printf "*#$@~\!&*()[]\n"
*#~\!&*()[]
$ printf "*#$@~\!&*()[]\n" | sed 's/[*#$@~!&*()\[\]]//g'
*#~\!&*()
$
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

在里面[...],反斜杠并不特殊。[\[]匹配反斜杠和[1

如果要]在集合中包含该字符,则必须确保它是第一个:[]X]匹配]Xwhile[X]]将匹配X后跟](并且[X\]]将匹配X\后跟])。要排除它,它必须紧跟在^:之后[^]X]是除]or 之外的任何字符X

所以,在你的例子中:

sed 's/[]*\#$@~!&*()[]//g'
Run Code Online (Sandbox Code Playgroud)

1sed当 POSIX 一致性模式尚未启用(通过$POSIXLY_CORRECT--posix)时,GNU 有一些例外,这就是为什么,为了与该实现兼容,当您确实需要将反斜杠包含在集合中时,最好将其写为[\\].