为什么我无法在 sed 中转义大括号“]”?

为什么我无法在 sed 中转义大括号“]”?

问题: 为什么我无法逃脱“]”?

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

答案1

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

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

所以,在你的例子中:

sed 's/[]*\#$@~!&*()[]//g'

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

相关内容