从命令输出中搜索值,然后只打印找到的值

时间:2012-01-06 15:23:16

标签: regex perl

我从perl调用我的程序并获取输出:

$output = `$calling 2>>bla.txt`;

现在我只需要一个特定的值,它将在输出中显示,我可以用Regex查看。 所需的输出是:

  

从XY段到其质心的距离为:3.455564713591596

XY是任何数字,我只是匹配“它的质心是:”以下:

if( $output =~ m/\sto\sits\sCentroid\sis:\s(\d)*$/)

但是,我如何只得到接近结尾的值? 我只是想把它打印在屏幕上。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

而不是\d*(“零或更多数字”),您可能需要匹配\d+([.]\d+)?(“一个或多个数字,可选地后跟一个小数点和一个或多个附加数字”) 。那会给你:

if( $output =~ m/\sto\sits\sCentroid\sis:\s\d+([.]\d+)?$/)

(Jonathan Leffler指出这一点)。

完成后 - 您想要捕获\d+([.]\d+)?,因此,将其包装在括号中以创建捕获组:

if( $output =~ m/\sto\sits\sCentroid\sis:\s(\d+([.]\d+)?)$/)

然后特殊变量$1将是它捕获的内容:

if( $output =~ m/\sto\sits\sCentroid\sis:\s(\d+([.]\d+)?)$/)
    { print $1; }

请参阅the "Extracting matches" section of the perlretut ("Perl regular expressions tutorial") manual-page

顺便说一下,\s匹配单个空白字符。通常你想要只匹配一个实际的空间 - 例如to its而不是to\sits - 或匹配一个或更多空白字符 - 例如to\s+its

答案 1 :(得分:3)

使用括号打印在正则表达式中捕获的数字:

print "$1\n" if ($output =~ m/\sto\sits\sCentroid\sis:\s([-+]?\d*\.?\d+)$/);

您还要确保正则表达式可以拾取带小数点的数字,并且我也允许使用可选符号。如果您需要担心可选指数,请在我的正则表达式(?:[eE][-+]?\d+)?之后添加\d+

如果您还有其他与该值有关的内容,请转换为常规if语句:

if ($output =~ m/\sto\sits\sCentroid\sis:\s([-+]?\d*\.?\d+)$/)
{
    print "$1\n";
    process_centroid($1);
}