Bash 脚本 grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

Bash 脚本 grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

我一直在编写一个脚本并试图理解它,这是我无法理解的一段。

grep -E "[a-z,A-Z,0-9\.\-]{2,}" /etc/hostname 在这段代码中,我确实明白它尝试从 /etc/hostname 获取数据。任何以 az 或 AZ 或数字开头的都可以。

但是,从以下开始:

\.\-]{2,}

这部分我无法解决。谁能解释一下那是什么?

答案1

这是正则表达式的含义,从左到右:

[

字符集(或字符类)的开始。它匹配该集中的一个字符。

a-z,A-Z,0-9

在字符集中意味着匹配任何一个字符a-zA-Z0-9。此处的逗号实际上是可选的,除非您试图从字面上匹配逗号。

\.\-

.是一个特殊字符,可以匹配任何字符,但在字符集中它没有特殊含义,不需要转义。这里-不必转义,如果它是集合中的第一个或最后一个字符,则它与文字匹配-,只有在集合中的两个其他字符之间时,它才具有特殊含义。

]

字符集的结尾。该集合匹配任何一个字符a-zA-Z0-9.-

{2,}

是一个量词。这意味着前面的正则表达式要匹配 2 次或更多次。

所以命令可以简化为:

grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname

当与标志一起使用时,-Pgrep 将模式解释为 Perl 正则表达式。 Perl 正则表达式与 Python 正则表达式几乎相同。这是一种比-E我认为更强大的模式。在 Perl 模式下你的命令变成:

grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname

答案2

{2,}一个量词,在这种情况下,它将匹配列表中 2 到尽可能多的字母实例[]

\.\-匹配“-”或“.”。这两个字符通常很特殊,通常需要使用 进行转义\。但在组内部[],点并不特殊,因此\在这种情况下不需要 。此外,它-是一个范围指示器,如果它是组中的第一个或最后一个,则并不特殊。

所以,最后你可以使用:

[,a-zA-Z0-9.-]{2,}

相关内容