格式化perl正则表达式捕获组

时间:2015-12-15 23:07:18

标签: regex bash perl

考虑以下情况。这是假设,但展示了我想要完成的一般事情。

假设我有一个文件,它有一行或多行。在每一行中,它可能有一个或多个[name] = [value]的实例,其中[name]是某个变量名称,[value]是某个值。进一步假设每个都与/[a-zA-Z]+=[0-9]+/匹配。

我想要的是一个perl表达式,它将打印出每个匹配,以特定方式格式化。我的意图是在命令行上使用它来解析文件中的数据。假设解决方案无效,因为perl实际上并不接受这种语法:print m/([a-zA-Z]+)=([0-9]+)/name: \1, value: \2\n/g,当在每一行上运行时,在我们的理想世界中,会打印出来自每一行的每个匹配,如{{1} },每个格式化的匹配在它自己的行上。

例如,请考虑此输入文件test.txt:

name:[name], value:[value]

假设我们然后将我们的魔术命令输入bash,如下所示:

blah blah count=5 blah i=1
books=2 blah
blah fairies=87 water=0

(对所有返回的匹配要求某种循环可能更合理,但希望你明白这一点。)

它将打印以下内容:

perl -n -e 'print m/([a-zA-Z]+)=([0-9]+)/name: \1, value: \2\n/g' test.txt

我意识到这种语法实际上并不起作用,但我希望尽可能简单地完成同样的事情。我希望能够偶尔在命令行中使用它来查找和格式化文本。我已经编写了自己的ruby脚本,但它有点儿麻烦,并没有包含在标准环境中(或者在任何人的环境中,但我自己的环境)。有人知道一些perl的秘密吗?

2 个答案:

答案 0 :(得分:9)

你非常接近。 ; - )

$ perl -ne 'print "name: $1, value: $2\n" while /([a-zA-Z]+)=([0-9]+)/g;' test.txt
name: count, value: 5
name: i, value: 1
name: books, value: 2
name: fairies, value: 87
name: water, value: 0

编辑:因为您的comment似乎表示短片更好,所以这是一个削减了几个字符的版本:

$ perl -lne 'print "name: $1, value: $2" while /([A-Z]+)=(\d+)/gi' test.txt

答案 1 :(得分:1)

我的建议是 - 考虑将你的变量选为哈希值。

use Data::Dumper;
local $/;
my %stuff = <> =~ m/(\w+)=(\d+)/g;
print Dumper \%stuff ;

应该大概做你想要的。