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)
这部分我无法解决。谁能解释一下这是怎么回事?
这是您的正则表达式的含义,从左到右:
[
Run Code Online (Sandbox Code Playgroud)
字符集(或字符类)的开始。它匹配集合中的一个字符。
a-z,A-Z,0-9
Run Code Online (Sandbox Code Playgroud)
一字符组内的装置相匹配的任一字符a-z
或A-Z
或0-9
。逗号在这里实际上是可选的,除非您尝试逐字匹配逗号。
\.\-
Run Code Online (Sandbox Code Playgroud)
.
是一个特殊字符,它可以匹配任何字符,但在字符集中它没有特殊含义,不必进行转义。-
不必对here 进行转义,如果它是集合中的第一个或最后一个字符,则它与文字匹配-
,则它仅在集合中的其他两个字符之间具有特殊含义。
]
Run Code Online (Sandbox Code Playgroud)
字符集的结尾。该集合匹配任何一个字符a-z
or A-Z
or 0-9
or .
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)
是{2,}
一个量词,在这种情况下,它将匹配列表中 2 到尽可能多的字母实例[]
。
将\.\-
匹配“-”或“.”。这两个字符通常很特殊,通常需要使用 进行转义\
。但在组内部[]
,点并不特殊,因此\
在这种情况下不需要 。此外,它-
是一个范围指示器,如果它是组中的第一个或最后一个,则并不特殊。
所以,最后你可以使用:
[,a-zA-Z0-9.-]{2,}
Run Code Online (Sandbox Code Playgroud)