首页 > 解决方案 > 如何在 grep [] 语法中禁用 ^ 字符的特殊含义?

问题描述

假设,我有一个如下文件:

aaa1bbb
aaa^bbb
aaa\bbb
aaa%bbb
aaa*ccc
aaa(ccc
aaa)bbb

我想找到所有包含^or%和 then的行bbb。我的预期结果:

aaa^bbb
aaa%bbb

当我执行时,grep '[^%]bbb' t1我收到了

aaa1bbb
aaa^bbb
aaa\bbb
aaa)bbb

这是完全正确的。^是 grep[]语法中的元宪章。我有除%bbb正则表达式之外的所有结果。我明白这一点。我试图用\这样的方式禁用元字符:grep '[\^%]bbb' t1我收到了:

aaa^bbb
aaa\bbb
aaa%bbb

为什么我aaa\bbb在结果中得到了线条?问题是:如何禁用^grep[]语法中字符的特殊含义?是否可以不使用fgrep或其他解决方法?

标签: regexgrep

解决方案


^在括号表达式中创建文字 char,请将其放在 NOT 开头:

grep '[%^]bbb' t1

这是所谓的“智能放置”技术的一部分,例如,要在括号表达式中使用 a ],它必须放置在括号表达式的开头,并且-应该位于括号表达式的开头或结尾。

查看在线演示

#!/bin/bash
s='aaa1bbb
aaa^bbb
aaa\bbb
aaa%bbb
aaa*ccc
aaa(ccc
aaa)bbb'
grep '[%^]bbb' <<< "$s"

输出:

aaa^bbb
aaa%bbb

推荐阅读