输出与STDIN的第一个正则表达式匹配

时间:2016-12-05 01:27:41

标签: regex bash perl

在bash中,我有以下内容:

#!/bin/bash 
curl $1 | tac | tac | perl -e '/(\d\d(?=:\d\d))/g; print $1' > $2

我想要的只是来自curl输出的第一个匹配,并将其打印到输出文件。我用./scriptname url outputfile.txt运行脚本但没有打印任何内容。我的正则表达式在http://regexr.com上有效,所以我确定这是我对Perl不了解的。我究竟做错了什么?感谢。

2 个答案:

答案 0 :(得分:0)

  

我想这意味着perl -ne正在逐行读取输入。是否有一种简单的方法让perl只返回第一个结果?

考虑使用sed:

... | sed '/^.*\([[:digit:]]\{2\}\):[[:digit:]]\{2\}.*/{s//\1/;q};d'

在Perl中,那将是:

... | perl -nle 'if (s/^.*(\d\d):\d\d.*/$1/) { print; exit }'

使用--perl-regexp编译的GNU Grep:

... | grep -m1 -Po '\d\d(?=:\d\d)'

答案 1 :(得分:0)

有一些问题:

  • 你从未读过STDIN。
  • 第一场比赛结束后你不会停止尝试比赛。
  • 无条件打印。

如果您想要所有比赛(根据您的原始问题):

perl -nle'print for /\d\d(?=:\d\d)/g'

如果您想要第一场比赛(根据您的评论):

perl -nle'if (/\d\d(?=:\d\d)/) { print $&; exit }'

perl -nle'if (/(\d\d):\d\d/) { print $1; exit }'

grep -Pom1 '\d\d(?=:\d\d)'

注意:

  • -n使用从STDIN读取的循环包装代码。