bash 正则表达式:星号元字符杀死多余的换行符

bash 正则表达式:星号元字符杀死多余的换行符

为了使用 测试星号元字符在搜索操作中的基本功能,我使用了一个包含以下内容的grep文件 ( ):regex.txt

$ cat regex.txt
1
11
111
1111
11111





$

在我的示例中,有意添加了6 个换行符11111

问题1.

为什么 的输出与 的输出不同,grep "11*" regex.txt不包括后面的换行符?11111grep "1*" regex.txt

问题2。

的输出grep "111*" regex.txt

11
111
1111
11111

的输出grep "1111*" regex.txt

111
1111
11111

的输出grep "11111*" regex.txt

1111
11111

为什么搜索键中每次增加“1”都会丢失顶层?

答案1

你的两个问题基本是一样的。在正则表达式中,*表示“匹配前一个字符 0 次或多次”。所以,1*将匹配 0 个或多个1,但11*将匹配 a1 已关注0 或更多1。这意味着

  • grep "11*"只会打印包含以下内容的行至少1。仅*适用于第二个1,因此第一个是强制性的。这就是为什么你看不到空行,它们不匹配1

  • grep "1*"将匹配 0 个或多个1。在这里,您没有需要匹配的前置字符,因此空行也会匹配,因为它们包含 0 1

  • grep "111*"grep "1111*"不匹配的原因与上面第一点相同。111*只会打印包含以下内容的行至少2 1,可能更多。1111*将匹配包含以下内容的行至少3 1,可能更多。

这里的要点是,*仅影响紧邻其之前的字符,而不影响整个模式。要为整个模式提供量词,您可以使用括号:

$ grep '\(111\)*' regex.txt 
1
11
111
1111
11111





$    

在这里,括号(需要对其进行转义,\以便它们不会包含在搜索模式中)将字符分组在一起,以便将*应用于该组。正如您在上面看到的,它匹配包含 0 次或多次出现的行111,因此它会打印所有行。

答案2

'1*'选择零个或多个为 1 的字符。1选择一个为 1 的字符。空行不包含任何为 1 的字符,但它有零个字符是一。

相关内容