15

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

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

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

更新:

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

既然人们在问,最终我想学习使用 Perl 来编写强大的单行代码,但最迫切的是我需要一个单行代码来从大文本文件中的每一行中提取连续的数字。

4

2 回答 2

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

或者

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

或者

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

或者

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

或许

perl -nE'$,=" ";say/\d+/g'
于 2013-07-15T23:04:49.000 回答
1

首先,您需要使用 -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/"

反而。

于 2013-07-15T23:04:38.833 回答