Perl Grep命令在数组中搜索

时间:2019-03-21 21:48:02

标签: regex perl grep

我正在使用Perl和grep命令在数组输出中查找模式。 我有兴趣在数组中搜索以下文本:

/tmp/12345.hash

12345可以是任何数字序列,例如234567889,但是/tmp/.hash将保持一致。我对regex不太满意,因此不确定如何构建正确的regex语句。

@line = grep /hash/, @exp;

我最初的搜索只是看单词hash,但在其他行上匹配,结果我得到了错误的结果。

1 个答案:

答案 0 :(得分:4)

Regex允许您以更高的精度将需求编码为“模式”:

my @filtered = grep { m{^/tmp/[0-9]+\.hash$} } @all;

我将{}用作定界符,因为对于普通的//,必须将模式中的每个/都转义。然后,在前面需要m(与//分隔符不同,在分隔符中可以省略它)。

锚点^匹配字符串的开头(如果/m“修饰符”有效,则匹配其他位置)/tmp似乎是路径的开始,但是如果前面有(例如)前导空格,则上述内容将不匹配(除非您将其更改为^\s*/tmp,以便允许可选空格)。仔细考虑您的数据。

$与字符串的末尾匹配,或者如果有一个(/m修饰符对此进行了更改),则在末尾的换行符之前匹配。要在hash之后匹配更多字符的字符串,请删除$

模式本身使您在问题描述中所讲的内容定下来:必须有一个整数,该整数是变化的,其余的是固定的。

教程perlretut随附了Perl自己的(优秀)文档。


使用修饰符$str =~ /.../m,该字符串被视为多行字符串,因此如果其中包含换行符,则^和{{1} }中的正则表达式也匹配每行的开头和结尾。

始终仅匹配字符串结尾的锚点是$(另请参见\z,它与\Z匹配,但对$不敏感)。请参阅Assertions in perlre,并在this page上查看答案。