Bash中grep字符类取反匹配失效问题求助
Grep取反匹配问题解析及解决方法
相关手册内容翻译(GNU grep字符类与括号表达式)
- 括号表达式
[0123456789]用于匹配单个数字字符。 - 以
^开头的括号表达式(如[^()])代表取反匹配,匹配任何不在括号内的单个字符。注意:在括号表达式内部,^只有放在最开头时才具备取反功能;若处于其他位置,它只是普通字符。另外,括号()在括号表达式内部属于普通字符,无需转义,不会被当作正则分组符号。
你的命令问题分析
grep [^abc] test
未加引号时,Bash会优先对[^abc]执行文件名通配符扩展;即便没有匹配的文件,Grep收到的正则逻辑是匹配行内存在任意非a/b/c的字符。测试文件中所有行的line部分都包含大量非a/b/c的字符,因此所有行都被匹配输出。grep '[^abc]' test
加引号避免了Bash的通配符扩展,但正则逻辑仍为匹配行内存在非a/b/c的字符,所有行都满足该条件,故全量输出。grep '[^(abc)]' test
括号()在括号表达式内是普通字符,此正则实际匹配非(/a/b/c/)的字符,同样所有行的line部分符合要求,因此全输出。grep [^(abc)] test
未加引号时,Bash将()解析为命令分组的语法符号,直接触发语法错误,必须用引号包裹正则表达式以避免Bash解析特殊字符。
正确实现预期结果的命令
若要仅输出d line,可根据需求选择以下两种方式:
- 匹配行首非a/b/c的行:通过行首锚定符
^限定匹配位置grep '^[^abc]' test - 匹配完全不含a/b/c的行:使用
-v选项反向排除包含a/b/c的行grep -v '[abc]' test
内容的提问来源于stack exchange,提问作者john smith
相关产品推荐
相关产品推荐

