![为什么我无法将 ] 与 sed 匹配](https://linux22.com/image/204502/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%97%A0%E6%B3%95%E5%B0%86%20%5D%20%E4%B8%8E%20sed%20%E5%8C%B9%E9%85%8D.png)
我试图在 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'
。