Grep和%百分比符号

时间:2017-02-01 13:57:20

标签: regex bash grep

在命令行上使用grep时,当我使用%百分号时,我会得到不同的结果。

我希望这个表达式匹配它不会返回任何内容:

bash-4.1$ echo ' (in=Gen)' | grep -in '*(*)'

但是,如果我包含一个领先的百分比字符,则匹配:

bash-4.1$ echo ' (in=Gen)' | grep -in '%*(*)'
1: (in=Gen)

百分比%符号是grep中的特殊字符还是控制字符?查看可用的文档,我没有看到任何引用。

2 个答案:

答案 0 :(得分:3)

如果你输入任何其他(有效)字符,那么也会有匹配,例如使用,

% echo ' (in=Gen)' | grep -in ',*(*)'
1: (in=Gen)

问题在于您的模式,*(*),此处:

  • *表示匹配前面标记的零个或多个,因为没有前面的标记,它与字面上的*匹配。由于没有*存在,模式与任何内容都不匹配

%*(*)中:

  • %*表示匹配%零次或多次,因为没有%存在,grep不匹配%*;在这种情况下,grep仅匹配最后一个)

答案 1 :(得分:1)

grep使用的BRE(基本正则表达式)中(与ERE相对,来自egrepgrep -E的扩展RE,如果*也不是量词在前面的表达式中,它将与文字星相匹配。(这也发生在不在表达式开头的^和不在与行尾相匹配的位置$ :它们被解释为普通字符^$

来自man 7 regex

  

'^'是一个普通字符,除了在RE的开头或(!)括号的子表达式的开头,'$'是一个普通的字符,除了在RE的末尾或(!)          带括号的子表达式的结束,如果'*'出现在RE的开头或者开头,则'*'是普通字符          带括号的子表达式(在可能的前导'^'之后)。

关于你的第二个例子,唯一匹配的是结束括号(在顶部标有^):

              ^
echo ' (in=Gen)' | grep --color -in '%*(*)' 
1: (in=Gen)

注意使用--colorgrep来突出显示实际匹配的内容,这对于理解grep的行为非常宝贵。

您正在寻找的搜索,很可能就是这个:

% echo '*(in=Gen)' | grep -in --color '*(.*)'
1:*(in=Gen)