在命令行上使用grep时,我使用%
百分比符号时得到了不同的结果。Grep和百分比符号
我希望这个表达式匹配它没有返回值:
bash-4.1$ echo ' (in=Gen)' | grep -in '*(*)'
但是,如果我有一个领先的百分比字符这是一个比赛:
bash-4.1$ echo ' (in=Gen)' | grep -in '%*(*)'
1: (in=Gen)
是百分比%
符号特殊或控制字符在grep?看看可用的文档,我没有看到它的任何参考。
在命令行上使用grep时,我使用%
百分比符号时得到了不同的结果。Grep和百分比符号
我希望这个表达式匹配它没有返回值:
bash-4.1$ echo ' (in=Gen)' | grep -in '*(*)'
但是,如果我有一个领先的百分比字符这是一个比赛:
bash-4.1$ echo ' (in=Gen)' | grep -in '%*(*)'
1: (in=Gen)
是百分比%
符号特殊或控制字符在grep?看看可用的文档,我没有看到它的任何参考。
如果你把任何其他(有效)的字符,也会有一场比赛,例如,使用,
:
% echo ' (in=Gen)' | grep -in ',*(*)'
1: (in=Gen)
问题是与你的模式,*(*)
,在这里:
*
表示匹配前面的令牌的零个或更多,因为前面没有标记它匹配*
字面上。由于没有*
目前,该模式不虽然%*(*)
匹配任何东西:
%*
表示匹配%
零次或多次,因为没有%
目前,grep
用于匹配什么%*
;在这种情况下grep
仅匹配上次)
Nitpick:它不匹配任何空白。默认情况下,'grep'使用未锚定搜索,而在第二个示例中,它仅匹配括号及其内容。 – Phylogenesis
这个答案是错误的。如果没有可量化的量词,量词“*”不再是量词。它成为基本正则表达式中的一个文字'*'。 – joepd
在BRE(基本正则表达式),其grep
用途(与ERE,从egrep
或grep -E
扩展的RE,如果*
是也不前一表达式的量词,它将与字面星相匹配(这也会发生在不在表达式开头的^
和不在表达式开头的$
:它们被解释为正常字符^
和$
。
从man 7 regex
:
“^”是一个普通的字符,除了在RE或开始一个括号的子表达式的开头,“$”是一个普通字符,除了在RE或(结束(!)! ) 加括号的子表达式的末尾,如果它出现在RE的开头或括号内的子表达式的开始处(在可能的前导'^'之后),则'*'是普通字符。
关于你的第二个例子,什么是只匹配是右括号(顶部标有^
):
^
echo ' (in=Gen)' | grep --color -in '%*(*)'
1: (in=Gen)
通知书grep
使用--color
突出究竟是匹配的,这对理解grep的行为非常有价值)。
你正在寻找的SEACH,可能是这一个:
% echo '*(in=Gen)' | grep -in --color '*(.*)'
1:*(in=Gen)
''对自己意味着什么 - 这是一个量词。它意味着0个或更多的令牌在它之前。 – Phylogenesis
用你喜欢的任何东西代替'%',你会得到同样的结果。 –
你在混合'glob'和'regex'。默认情况下,'grep'将使用正则表达式,在这种情况下'*'被解释为一个量词(0或更多)。另一方面,其他工具如'bash','ls',...使用球体,其中'*'被解释为'0或更多任何字符'。正则表达式的等价物是'。*'('.':正则表达式中的任何字符,'*':0或更多次)。 – Aserre