在命令行上使用grep时,当我使用%
百分号时,我会得到不同的结果。
我希望这个表达式匹配它不会返回任何内容:
bash-4.1$ echo ' (in=Gen)' | grep -in '*(*)'
但是,如果我包含一个领先的百分比字符,则匹配:
bash-4.1$ echo ' (in=Gen)' | grep -in '%*(*)'
1: (in=Gen)
百分比%
符号是grep中的特殊字符还是控制字符?查看可用的文档,我没有看到任何引用。
答案 0 :(得分:3)
如果你输入任何其他(有效)字符,那么也会有匹配,例如使用,
:
% echo ' (in=Gen)' | grep -in ',*(*)'
1: (in=Gen)
问题在于您的模式,*(*)
,此处:
*
表示匹配前面标记的零个或多个,因为没有前面的标记,它与字面上的*
匹配。由于没有*
存在,模式与任何内容都不匹配在%*(*)
中:
%*
表示匹配%
零次或多次,因为没有%
存在,grep
不匹配%*
;在这种情况下,grep
仅匹配最后一个)
答案 1 :(得分:1)
在grep
使用的BRE(基本正则表达式)中(与ERE相对,来自egrep
或grep -E
的扩展RE,如果*
也不是量词在前面的表达式中,它将与文字星相匹配。(这也发生在不在表达式开头的^
和不在与行尾相匹配的位置$
:它们被解释为普通字符^
和$
。
来自man 7 regex
:
'^'是一个普通字符,除了在RE的开头或(!)括号的子表达式的开头,'$'是一个普通的字符,除了在RE的末尾或(!) 带括号的子表达式的结束,如果'*'出现在RE的开头或者开头,则'*'是普通字符 带括号的子表达式(在可能的前导'^'之后)。
关于你的第二个例子,唯一匹配的是结束括号(在顶部标有^
):
^
echo ' (in=Gen)' | grep --color -in '%*(*)'
1: (in=Gen)
注意使用--color
到grep
来突出显示实际匹配的内容,这对于理解grep的行为非常宝贵。
您正在寻找的搜索,很可能就是这个:
% echo '*(in=Gen)' | grep -in --color '*(.*)'
1:*(in=Gen)