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

标签 regex linux perl ubuntu

我在 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 还是很陌生(到目前为止只用了大约一个星期)。

最佳答案

首先,您不打印 $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;
    }
}

关于regex - 在 Perl 中创建正则表达式以提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12875541/

相关文章:

linux - 限制对 git 服务器目录的访问?

c++ - 在 Linux 中读取 txt 中的参数

perl - 查找未使用的 "use' d"Perl 模块

linux - 为什么我的 Perl 脚本在 "~/"上失败,但适用于 "$ENV{HOME}"?

mysql - 如何通过perl连接infobright DB?

regex - 如何将 $ 开头的变量与正则表达式匹配?

javascript - 有条件地去除 HTML 标记内容的正则表达式

java - 仅当 Java 中字符串中只有一位数字时才删除该数字

javascript - jQuery - 正则表达式工作异常

php - 程序可执行文件和日志文件的正确文件权限应该是什么?