在 Perl 中创建正则表达式以提取值

Posted

技术标签:

【中文标题】在 Perl 中创建正则表达式以提取值【英文标题】:Creating a Regex in Perl to extract a value 【发布时间】:2012-10-04 05:47:47 【问题描述】:

我在 Ubuntu 12.04 机器上从我的 Perl 脚本中的变量中提取某些值时遇到了一些麻烦。

我查看了这个页面:How to extract string following a pattern

这就是我想做的。我需要在某种模式之后提取一个字符串值。 这是我到目前为止的代码:

foreach $HDD (@sds)

    $hdStat = `hdparm -i $HDD | grep -Po 'Model=\K.*?(?=,)'`;
    $sdModel$HDD = $hdStat;
    $hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?(?=")'`;
    $sdSerial$HDD = $hdStat;

foreach $HDD (keys %sdModel)

    print $sdModel$HDD;

foreach $HDD (keys, %sdSerial)

    print $sdSerial$HDD;

它会很好地返回 Model 字符串,但不会返回 SerialNo 字符串。代码不必与 grep 一起使用;我刚刚修改了上面链接中的代码。看到我对正则表达式的可怕,我可能在这里遗漏了一些基本的东西。

顺便说一句,这段代码的目的是查看 /dev 文件夹以查找任何磁盘驱动器,如果找到了,则将其设置为一个数组,然后上面的脚本将在其中获取它的型号 # 和序列号。 此外,如果有人看到更好的方法来做我正在做的事情,我非常愿意接受建议。我对 Perl 还是很陌生(到目前为止只使用了大约一周)。

【问题讨论】:

也许您应该显示您的输入和预期输出。这就像问如何找到从纽约到波士顿的路和问如何驾驶汽车之间的区别。 @TLP 对不起,我是论坛的新手,就像我是 Perl 的新手一样。我的输入将是数组 sds 中的一个元素,在本例中为“/dev/sda”。输出应该是该驱动器的型号和序列号,在本例中为“ST380011A”和“5JVJ2BBA”。但是,序列号没有回来,我猜这是因为之后的分隔符。不过只是猜测。 【参考方案1】:

首先,您不打印 $sdSerial。

其次,您可以节省一些外部调用并简化您的正则表达式:

foreach my $HDD (@sds) 
    my @hdparm = `hdparm -i $HDD`;
    foreach my $ln (@hdparm) 
        if (my($model, $serial) = ($ln =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) 
            $sdModel$HDD = $model;
            $sdSerial$HDD = $serial;
        
    


以上可以简化为:

foreach my $HDD (@sds) 
    my $hdparm = `hdparm -i $HDD`;
    if (my($model, $serial) = ($hdparm =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) 
        $sdModel$HDD = $model;
        $sdSerial$HDD = $serial;
    

【讨论】:

我一定是忘记添加该打印件了,谢谢您看到它。不过,我的原始代码中有它,所以这不是问题。我试过你的代码,它有效!也为我节省了一点空间。感谢您的帮助!【参考方案2】:

为了提取序列号,试试这个正则表达式:

$hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?'`;

【讨论】:

这似乎对我不起作用。我直接在我的 Ubuntu 机器的 CLI 上输入了它,但没有返回任何内容(我当然删掉了变量,只留下了“hdparm ....”

以上是关于在 Perl 中创建正则表达式以提取值的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中创建正则表达式 [关闭]

如何 grep/perl/awk 重叠正则表达式

如何使正则表达式与 perl 命令一起使用并从文件中提取数字?

一行perl用正则表达式提取内容

Perl 正则表达式变量替换打印 1 而不是所需的提取

在 Perl 中使用正则表达式解析属性