将regexp与perl / sed / awk中的变量字符串匹配

时间:2014-10-17 21:00:19

标签: regex linux perl awk sed

我有这个表达:

XX h,YY min,ZZ s,

XX,YY或ZZ可以是1或2位数。另外" XX h,"或者" XX h,YY min,"也许不在场。任何人都可以推荐任何perl或sed表达式来提取XX YY和ZZ ??

我尝试了一些匹配的群组正则表达式而没有运气。

谢谢

编辑:

示例1:12小时,23分钟,2秒,

output1:12 23 2

示例2:3分钟,59秒,

output2:3 59

3 个答案:

答案 0 :(得分:1)

试试这个(Perl):

my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) [hms]/g;

或者更严格

my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) (?:h|min|s)/g;

if(scalar @matches == 3) {
    my ($h, $mi, $s) = @matches;
    print "$h : $mi : $s\n";
}

答案 1 :(得分:1)

echo "12 h, 3 min, 56 s," | tr -cd "0-9 "

输出:

12  3  56

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/h/ {print $1}'

12

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/min/ {print $1}'

3

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/s/ {print $1}'

56

答案 2 :(得分:1)

让我们谈谈Perl正则表达式。我们假设您需要能够提取以下子字符串:

12 h, 54 min, 11 s,   # you have a trailing comma in your example
1 h, 54 min, 11 s,
54 min, 11 s,
4 min, 11 s,
55 s,

等等。我们需要一些构建块:

\d:任何数字
?:当附加到某个内容(字符,\d之类的元字符或括号中的组)时,将其设为可选项 ( ):用于将值分组并提取到$1$2等的括号 (?: ):用于分组而不提取

的括号

秒部分为\d\d? s, 添加可选的分钟后,我们将获得(?:\d\d? min, )?\d\d? s, 添加小时(也可选)后,我们会获得(?:(?:\d\d? h,)? \d\d? min, )?\d\d? s, 现在我们在所有这些工作人员周围使用括号将匹配项捕获到$1,我们终于得到一个正则表达式:

/((?:(?:\d\d? h,)? \d\d? min, )?\d\d? s,)/

或者,尾随逗号也是可选的吗?只需在其后添加?即可。

如果您需要hmins的值,请将每个\d\d?放入一对括号并检查$2,{{ 1}}和$3

$4

这不是这项任务最简单的正则表达式,但我只想展示如何从非常简单的东西开始构建它们,然后向它添加更复杂的东西。