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

jes*_*e_b 0 sed text-processing regular-expression

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

$ echo 'foo [bar]' | sed -E 's/[\[\]]//g'
foo [bar]
Run Code Online (Sandbox Code Playgroud)

以下作品:

$ echo 'foo [bar]' | sed -E 's/\]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[\[]//g'
foo bar]
Run Code Online (Sandbox Code Playgroud)

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

$ echo 'foo [bar]' | sed -E 's/[\]]//g'
foo [bar]
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这甚至有效:

$ echo 'foo [bar]' | sed -E 's/[]]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[[]//g'
foo bar]
Run Code Online (Sandbox Code Playgroud)

但不是这个:

$ echo 'foo [bar]' | sed -E 's/[[]]//g'
foo [bar]
Run Code Online (Sandbox Code Playgroud)

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

αғs*_*нιη 7

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

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