在 grep 中如何转义括号内的方括号

4
我希望能够在正则表达式中匹配除方括号以外的其他字符。
具体来说,我想匹配一些特殊字符,不想匹配另一些字符,因此需要将它们指定出来。
# grep $'[^a-zA-Z0-9#\\/:!<>{},=?. ()["_+;*\'&|$-]' file

这里缺少一个],我已经尝试用\]\\]等转义字符,但是我需要它在[^]内部!

1个回答

7

] 立即放在 ^ 之后。

这里有一个示例。输入文件 "foo" 包含:

foo
[
bar
]
baz
quux

我们执行以下命令:
grep '[^][]' foo

输出结果为:

foo
bar
baz
quux

POSIX正则表达式的括号表达式文档中了解到:

如果右方括号(']')在列表中首次出现(如果有初始化的脱字符('^')),则它将失去其特殊意义并在一个括号表达式中表示自己。

还有:

句点、星号、左方括号和反斜杠(分别为period、asterisk、left-bracket和backslash)这些特殊字符在括号表达式中将失去它们的特殊含义。


1
你的表达是正确的,但是你的解释不够清晰。大多数正则表达式的实现在集合中不会将 \\ 识别为转义字符,因此你需要将 ] 放在语法中不是其一部分的位置——直接放在 [[^ 的后面。 - Guntram Blohm
@GuntramBlohm 你是正确的。有趣的是,在那一刻,我的手指比我的大脑更清楚该怎么做。我已经纠正了解释。 - Laurence Gonsalves
是的,它起作用了,但为什么需要这样做呢?有规范吗? - Tiago Pimenta
@TiagoPimenta 我已经添加了相关文档的链接和一些摘录。 - Laurence Gonsalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接