![bash 正则表达式:星号元字符杀死多余的换行符](https://linux22.com/image/77352/bash%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9A%E6%98%9F%E5%8F%B7%E5%85%83%E5%AD%97%E7%AC%A6%E6%9D%80%E6%AD%BB%E5%A4%9A%E4%BD%99%E7%9A%84%E6%8D%A2%E8%A1%8C%E7%AC%A6.png)
为了使用 测试星号元字符在搜索操作中的基本功能,我使用了一个包含以下内容的grep
文件 ( ):regex.txt
$ cat regex.txt
1
11
111
1111
11111
$
在我的示例中,有意添加了6 个换行符11111
。
问题1.
为什么 的输出与 的输出不同,grep "11*" regex.txt
不包括后面的换行符?11111
grep "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
。在这里,您没有需要匹配的前置字符,因此空行也会匹配,因为它们包含 01
。grep "111*"
等grep "1111*"
不匹配的原因与上面第一点相同。111*
只会打印包含以下内容的行至少21
,可能更多。1111*
将匹配包含以下内容的行至少31
,可能更多。
这里的要点是,*
仅影响紧邻其之前的字符,而不影响整个模式。要为整个模式提供量词,您可以使用括号:
$ grep '\(111\)*' regex.txt
1
11
111
1111
11111
$
在这里,括号(需要对其进行转义,\
以便它们不会包含在搜索模式中)将字符分组在一起,以便将*
应用于该组。正如您在上面看到的,它匹配包含 0 次或多次出现的行111
,因此它会打印所有行。
答案2
'1*'
选择零个或多个为 1 的字符。1
选择一个为 1 的字符。空行不包含任何为 1 的字符,但它做有零个字符是一。