从 bash 中不断变化的字符串中提取多个变量



>我在一个文件中有多个这样的字符串,每行一个:

[random string] was [failed/passed] 1y 2mo 3d 1h 51m 2s ago [some string]

现在我想做的是提取 6 个变量(年、月、日、小时、分钟、秒)的持续时间,以使用"日期"函数计算日期。我还想在变量(例如 O/1)中获取通过/失败。

我遇到了3个问题:

  • 我无法读取包含这些字符串的文件中的每一行(for 循环效果不佳......也许一段时间会更好)
  • 如果我设法读取一个字符串,我尝试用cut解析它,但我不知道如何摆脱字母(y,mo,h...)并只保留数字。

  • 持续时间格式是可变的;不到一年时可以是 1 个月 2 小时 3 秒,也可以是 1 年 3 天 58 分 3 秒,或 3 小时 5 秒...... 等等。我不知道如何处理这种可变性。我猜该命令必须检查字母并分配其功能,并将 0 分配给不存在的字母。

非常感谢您的帮助!

这是我认为适合您的perl代码。

#!/usr/bin/perl
my $string = <STDIN>;
chomp $userword; # Get rid of newline character at the end
@arr = $string =~ /(passed|failed).+?([d]+[yY].)?([d]+(?:mo|MO).)?([d]+[dD].)?([d]+[hH].)?([d]+[mM].)?([d]+[sS])/g;
$arr_len = scalar @arr;
print "Result: $arr[0]n";
for($i=1;$i<=$arr_len;$i=$i+1){
    $arr[$i]=~/(d+)([A-Za-z]*)/g;
    if ( $2 eq "y" | $2 eq "Y" ) {
        print "Year is $1n";
    } elsif ( $2 eq "mo" | $2 eq "MO") {
        print "Month is $1n";
    } elsif ( $2 eq "d" | $2 eq "D") {
        print "Day is $1n";
    } elsif ( $2 eq "h" | $2 eq "H") {
        print "Hour is $1n";
    } elsif ( $2 eq "m" | $2 eq "M") {
        print "Minute is $1n";
    } elsif ( $2 eq "s" | $2 eq "S" ) {
        print "Second is $1n";
    }
}

我尝试了三种不同的输入,它们是:

[random string] was failed 1y 2mo 3d 1h 51m 2s ago [some string]
[random string] was passed 2mo 3d 1h 51m 2s ago [some string]
asd  sd asdg s passed 1y 2mo 3d 1h 2s
[random string] was failed 1y 4d 5h 3m 2s ago [some string]

所有三个的输出都相应地显示:

Result: failed
Year is 1
Month is 2
Day is 3
Hour is 1
Minute is 51
Second is 2
Result: passed
Month is 2
Day is 3
Hour is 1
Minute is 51
Second is 2

Result: passed
Year is 1
Month is 2
Day is 3
Hour is 1
Second is 2

Result: failed
Year is 1
Day is 4
Hour is 5
Minute is 3
Second is 2

以下是一些事情:

  1. 我没有使用switch,因为它可能会给出一个错误,说Can't locate Switch.pm in @INC (you may need to install the Switch module)
  2. 我已经尽力尽可能简化正则表达式,所以如果有人可以建议更好的正则表达式来选择,请发表评论。
  3. 这也是我第一次尝试用perl编程。如果有人找到改进代码的方法,请建议我。我将不胜感激。

相关内容

  • 没有找到相关文章

最新更新