为什么我无法将 ] 与 sed 匹配

为什么我无法将 ] 与 sed 匹配

我试图在 sed 的字符集中匹配 或 ,但由于某种原因它不[喜欢]]

$ echo 'foo [bar]' | sed -E 's/[\[\]]//g'
foo [bar]

以下作品:

$ echo 'foo [bar]' | sed -E 's/\]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[\[]//g'
foo bar]

但由于某种原因,]该字符集的内部打破了它:

$ echo 'foo [bar]' | sed -E 's/[\]]//g'
foo [bar]

奇怪的是,这甚至有效:

$ echo 'foo [bar]' | sed -E 's/[]]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[[]//g'
foo bar]

但不是这个:

$ echo 'foo [bar]' | sed -E 's/[[]]//g'
foo [bar]

我是否只需要某种额外的转义或者这甚至可能吗?

答案1

]括号表达式内的 or不需要[转义。尽管括号表达式中的反斜杠失去了转义含义,并且它与字面反斜杠字符匹配。因此,当您这样做时[\]],您会告诉sed匹配两个字符:\第一[\]部分的 ,紧随其后的是];但\]输入中的字符串没有匹配,因此没有发生任何更改。要匹配某个字符,仅当您喜欢在括号表达式中使用它]时才需要,否则也可以使用文字。[]]]

另请注意,在方括号表达式中[...],字符]必须是第一个字符,因此's/[[]]//g'您应该这样做's/[][]//g'

相关内容