在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不了解的。我究竟做错了什么?感谢。
答案 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)
有一些问题:
如果您想要所有比赛(根据您的原始问题):
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读取的循环包装代码。