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

Can*_*urc 6 grep regular-expression

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

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

但是,从以下开始:

\.\-]{2,}
Run Code Online (Sandbox Code Playgroud)

这部分我无法解决。谁能解释一下这是怎么回事?

nag*_*ani 6

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

[
Run Code Online (Sandbox Code Playgroud)

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

a-z,A-Z,0-9
Run Code Online (Sandbox Code Playgroud)

一字符组内的装置相匹配的任一字符a-zA-Z0-9。逗号在这里实际上是可选的,除非您尝试逐字匹配逗号。

\.\-
Run Code Online (Sandbox Code Playgroud)

.是一个特殊字符,它可以匹配任何字符,但在字符集中它没有特殊含义,不必进行转义。-不必对here 进行转义,如果它是集合中的第一个或最后一个字符,则它与文字匹配-,则它仅在集合中的其他两个字符之间具有特殊含义。

]
Run Code Online (Sandbox Code Playgroud)

字符集的结尾。该集合匹配任何一个字符a-zor A-Zor 0-9or .or -

{2,}
Run Code Online (Sandbox Code Playgroud)

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

所以命令可以简化为:

grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname
Run Code Online (Sandbox Code Playgroud)

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

grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
Run Code Online (Sandbox Code Playgroud)


Ste*_*uch 0

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

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

所以,最后你可以使用:

[,a-zA-Z0-9.-]{2,}
Run Code Online (Sandbox Code Playgroud)