2017-02-01 151 views
2

在命令行上使用grep时,我使用%百分比符号时得到了不同的结果。Grep和百分比符号

我希望这个表达式匹配它没有返回值:

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

但是,如果我有一个领先的百分比字符这是一个比赛:

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

是百分比%符号特殊或控制字符在grep?看看可用的文档,我没有看到它的任何参考。

+3

''对自己意味着什么 - 这是一个量词。它意味着0个或更多的令牌在它之前。 – Phylogenesis

+1

用你喜欢的任何东西代替'%',你会得到同样的结果。 –

+1

你在混合'glob'和'regex'。默认情况下,'grep'将使用正则表达式,在这种情况下'*'被解释为一个量词(0或更多)。另一方面,其他工具如'bash','ls',...使用球体,其中'*'被解释为'0或更多任何字符'。正则表达式的等价物是'。*'('.':正则表达式中的任何字符,'*':0或更多次)。 – Aserre

回答

3

如果你把任何其他(有效)的字符,也会有一场比赛,例如,使用,

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

问题是与你的模式,*(*),在这里:

  • *表示匹配前面的令牌的零个或更多,因为前面没有标记它匹配*字面上。由于没有*目前,该模式不

虽然%*(*)匹配任何东西:

  • %*表示匹配%零次或多次,因为没有%目前,grep用于匹配什么%*;在这种情况下grep仅匹配上次)
+0

Nitpick:它不匹配任何空白。默认情况下,'grep'使用未锚定搜索,而在第二个示例中,它仅匹配括号及其内容。 – Phylogenesis

+0

这个答案是错误的。如果没有可量化的量词,量词“*”不再是量词。它成为基本正则表达式中的一个文字'*'。 – joepd

1

在BRE(基本正则表达式),其grep用途(与ERE,从egrepgrep -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)