Perl one-liner提取字符组

时间:2013-07-15 22:51:35

标签: perl

我正在尝试使用Perl单行提取一组字符,但我没有成功:

echo "hello_95_.txt" | perl -ne 's/.*([0-9]+).*/\1/'

什么都不返回,而我希望它返回95。我怎么能用Perl做到这一点?

更新

请注意,与建议的副本相比,我对如何从命令行执行此操作感兴趣。当然这看起来是微妙的差异,但除非你已经知道如何有效地使用Perl单行,否则它并不简单。

由于人们在问,最终我想学习使用Perl编写功能强大的单行程序,但大多数情况下我需要一个单行程序来从大文本文件中的每一行中提取连续数字。

2 个答案:

答案 0 :(得分:11)

perl -pe's/\D*(\d+).*/$1/'

perl -nE'/\d+/&&say$&'

perl -nE'say/(\d+)/'

perl -ple's/\D//g'

或可能是

perl -nE'$,=" ";say/\d+/g'

答案 1 :(得分:0)

首先,您需要使用-p而不是-n开关。

您需要修改正则表达式,如:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/\1/"

查找最长的非贪婪字符串,后跟一个或多个数字,后跟任意数量的字符到行尾。

请注意,尽管'\ 1'可作为反向引用,并且对SED / AWK用户更为熟悉,但'$ 1'是更新的形式。所以,您可能希望使用:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/$1/"

代替。