我一直在编写一个脚本并试图理解它,这是我无法理解的一段。
grep -E "[a-z,A-Z,0-9\.\-]{2,}" /etc/hostname
在这段代码中,我确实明白它尝试从 /etc/hostname 获取数据。任何以 az 或 AZ 或数字开头的都可以。
但是,从以下开始:
\.\-]{2,}
这部分我无法解决。谁能解释一下那是什么?
答案1
这是正则表达式的含义,从左到右:
[
字符集(或字符类)的开始。它匹配该集中的一个字符。
a-z,A-Z,0-9
在字符集中意味着匹配任何一个字符a-z
或A-Z
或0-9
。此处的逗号实际上是可选的,除非您试图从字面上匹配逗号。
\.\-
.
是一个特殊字符,可以匹配任何字符,但在字符集中它没有特殊含义,不需要转义。这里-
不必转义,如果它是集合中的第一个或最后一个字符,则它与文字匹配-
,只有在集合中的两个其他字符之间时,它才具有特殊含义。
]
字符集的结尾。该集合匹配任何一个字符a-z
或A-Z
或0-9
或.
。-
{2,}
是一个量词。这意味着前面的正则表达式要匹配 2 次或更多次。
所以命令可以简化为:
grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname
当与标志一起使用时,-P
grep 将模式解释为 Perl 正则表达式。 Perl 正则表达式与 Python 正则表达式几乎相同。这是一种比-E
我认为更强大的模式。在 Perl 模式下你的命令变成:
grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
答案2
是{2,}
一个量词,在这种情况下,它将匹配列表中 2 到尽可能多的字母实例[]
。
将\.\-
匹配“-”或“.”。这两个字符通常很特殊,通常需要使用 进行转义\
。但在组内部[]
,点并不特殊,因此\
在这种情况下不需要 。此外,它-
是一个范围指示器,如果它是组中的第一个或最后一个,则并不特殊。
所以,最后你可以使用:
[,a-zA-Z0-9.-]{2,}