我的下面的代码非常简单...我正在做的就是使用IP地址REGEX来搜索文件,找到与我的REGEX匹配的任何IP地址,我想将它们存储在@ array2中。
我知道我的REGEX有效,因为我已经在linux命令行上对它进行了测试,它完全符合我的要求,但当它集成到脚本中时,它只返回空白。应该有700个IP存储在数组中。
#!/usr/bin/perl
use warnings;
use strict;
my @array2 = `grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt`;
print @array2;
答案 0 :(得分:3)
反引号``
默认情况下表现得像双引号字符串。
因此你需要逃避反斜杠:
my @array2 = `grep -Eo "\\"\\b[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\"" test1.txt`;
或者,您可以使用单引号版本的qx
来避免任何插值:
my @array2 = qx'grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt';
但是,我建议的方法是根本不用shell,而是在perl中执行此逻辑:
my @array2 = do {
open my $fh, '<', 'test1.txt' or die "Can't open file: $!";
grep /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/, <$fh>;
};
答案 1 :(得分:2)
我真的不会混淆bash和perl。这只是在寻求痛苦。 Perl可以在本地完成所有工作。
类似的东西:
open (my $input_fh, "<", "test.txt" ) or die $!;
my @results = grep ( /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/, <$input_fh> );
然而,这需要将文件压入内存,这不是最佳的 - 我通常使用while
循环。
答案 2 :(得分:1)
反引号内的文字经过双引号替换。你需要加倍你的反斜杠。
无论如何,从Perl内部运行grep
是可疑的;只是在文本文件中啜饮并使用Perl查找匹配项。
答案 3 :(得分:0)
从外部命令检索输出的最简单方法是使用open():
open(FH, 'grep -Eo \"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\" test1.txt'."|")
my @array2=<FH>;
close (FH);
..虽然我觉得Sobrique的想法是最好的答案。