【问题标题】:Perl one-liner to extract groups of charactersPerl 单行提取字符组
【发布时间】:2013-07-13 23:12:12
【问题描述】:

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

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

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

更新:

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

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

【问题讨论】:

  • 这不是 perl,它是 sed。你想做什么?从文件名中提取整数?
  • 谢谢@YatinSaraiya 我已经更新了我的 OP。我想使用 Perl,而不是 sed。
  • 最后我想用这个单行从大文本文件的每一行中提取连续的数字
  • 谢谢@YatinSaraiya 你可能是对的,但我正在尝试切换到 Perl 来完成大多数文本提取/替换任务(使用 awk/sed/etc 学习复杂查询的语法可能很乏味)跨度>

标签: perl


【解决方案1】:
perl -pe's/\D*(\d+).*/$1/'

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

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

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

或者可能是

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

【讨论】:

  • $& 最好写成(\d+) && say $1
  • @squiguy 是的,它会更快但更长。
  • 谢谢! - 这三个选项有什么区别?
  • 哇! OP 要求单行,而不是code golf。使用一些空格。 (否则,答案很好,但说真的,&&say$&?)
  • 对于其他任何经历过这个地狱的人:单引号显然很重要(您不能在命令中使用双引号)。至少在 tcsh 上,echo what the frack | perl -pe's/^wh(at)/$1/' 产生的输出不同于 echo what the frack | perl -pe"s/^wh(at)/$1/"
【解决方案2】:

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

改为。

【讨论】:

  • RHS 中的 control-A 是怎么回事?
  • $ echo "hello_95_.txt" | perl -Mwarnings=FATAL,all -pe "s/^.*?([0-9]+).*$/\1/" Illegal variable name. $ echo "hello_95_.txt" | perl -Mwarnings=FATAL,all -pe 's/^.*?([0-9]+).*$/\1/' \1 better written as $1 at -e line 1. Exit 255
  • “当前”接受的表格?您知道“当前”在说什么吗?另外,你的双引号是 gebroken.
  • 对不起? 你认为谁写了这段文字?警告是因为你不应该这样做。而且您仍然有损坏的双引号。至于操作系统,您似乎将外壳误认为是操作系统。不是。
  • 郑重声明,@tchrist 无疑是与 Perl 相关的最佳信息来源,我尊重他的智慧。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多