Regex 设置perl正则表达式捕获组的格式

Regex 设置perl正则表达式捕获组的格式,regex,bash,perl,Regex,Bash,Perl,考虑以下情况。这是假设性的,但说明了我希望完成的一般性工作 假设我有一个文件,它有一行或多行。在每一行上,它可能有一个或多个[name]=[value],其中[name]是一些变量名,[value]是一些值。进一步假设每一个都由/[a-zA-Z]+=[0-9]+/匹配 我想要的是一个perl表达式,它将以特定的方式打印出每个匹配项。我的目的是在命令行上使用它来解析文件中的数据。一个假设的解决方案,由于perl实际上不接受这种语法而变得无效:print m/([A-zA-Z]+)=([0-9]+)

考虑以下情况。这是假设性的,但说明了我希望完成的一般性工作

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

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

例如,考虑这个输入文件test .txt:< /p>

blah blah count=5 blah i=1
books=2 blah
blah fairies=87 water=0
假设我们随后在bash中键入magic命令,如下所示:

perl -n -e 'print m/([a-zA-Z]+)=([0-9]+)/name: \1, value: \2\n/g' test.txt
name: count, value: 5
name: i, value: 1
name: books, value: 2
name: fairies, value: 87
name: water, value: 0
(要求对所有返回的匹配进行某种循环可能更合理,但希望您能理解。)

它将打印以下内容:

perl -n -e 'print m/([a-zA-Z]+)=([0-9]+)/name: \1, value: \2\n/g' test.txt
name: count, value: 5
name: i, value: 1
name: books, value: 2
name: fairies, value: 87
name: water, value: 0
我意识到这种语法实际上不起作用,但我想用尽可能简短的perl来完成同样的事情。我希望能够偶尔在命令行上使用它来查找和格式化文本。我已经编写了自己的ruby脚本,但它有点缺陷,并且没有包含在标准环境中(或任何人的环境中,但我自己的环境除外)。有人知道一些perl的秘密吗?

你很接近了

编辑:因为您的代码似乎表明越短越好,所以这里有一个删除了几个字符的版本:

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

我的建议是考虑把你的VARS选成散列。
use Data::Dumper;
local $/;
my %stuff = <> =~ m/(\w+)=(\d+)/g;
print Dumper \%stuff ;
使用数据::转储程序;
本地$/;
我的%stuff==m/(\w+)=(\d+)/g;
打印转储文件\%的内容;

应该做你想做的事情

一个可能的解决方案是,如果有一种简洁的方法返回一组匹配项,然后对每个匹配项应用查找/替换,并将其打印出来。太好了,谢谢!此外,它似乎不需要在结尾使用分号,这略微减少了我使用它时需要键入的字符数。@Erhannis是的---分号对于块中的最后一条语句是可选的。不过,如果你想再少写几个字符,请看我的更新答案。不要追逐紧凑型。如果您经常使用它,那么就编写一个脚本。