.
表示匹配正则表达式中的任何字符。
*
表示前面的单个正则表达式出现零次或多次。我的alphabet.txt
包含一行
abcdefghijklmnopqrstuvwxyz
并不grep a.*z alphabet.txt
意味着匹配以 开头a
、中间有零个或多个任何类型的单个字符、并且以z
? 结尾的任何子字符串。例如,abz
,abbz
,ahhhhhz
,但不匹配abbdz
?
我以为grep a.*z alphabet.txt
我的字母文件中不会出现这一行。
答案1
*
表示重复紧接在前的模式,而不是重复匹配的文本。例如,[ab]*
表示(|[ab]|[ab][ab]|[ab][ab][ab]|…)
模式[ab]
重复零次或多次。它将匹配,"aba"
因为这完全满足模式[ab][ab][ab]
。
有了.*
,它就变成(|.|..|...|....|…)
,因此它可以匹配任意数量的字符,并且字符可以不同。
答案2
在中abbdz
,仅仅因为首先.
匹配并不意味着只会匹配表达式的其余部分。b
.
b
答案3
重复修饰符,例如*
作用于前一个正则表达式原子,不是在匹配的字符的重复前面的正则表达式原子。例如:
$ printf 'az\nabz\nabbz\nabbbz\nabcz\n' | sed -n '/a.*z/p'
az
abz
abbz
abbbz
abcz
(所有行都匹配)。如果您只想匹配匹配字符,您可以使用反向引用:
$ printf 'az\nabz\nabbz\nabbbz\nabcz\n' | sed -n '/a\(.\)\1*z/p'
abz
abbz
abbbz
答案4
grep a.*z
匹配第一次出现 a 和最后一次出现 z 之间的所有内容,包括第一个 a 和最后一个 z。 是.*
一个通配符表达式,可匹配任何字符序列,包括长度为 0 的空序列。grep a.*z
匹配以下所有以 a 开头并以 z 结尾的字符串:“abcdefghijklmnopqrstuvwxyz”、“abz”、“abbz”、“ahhhhhz”和“abbdz”。 它还匹配跨多行的文本,例如此文本:
abcdefghijklmnopqrstuvwxyz
abz
abbz
ahhhhhz
abbdz