Regex 从Perl一行正则表达式获取返回参数

Regex 从Perl一行正则表达式获取返回参数,regex,windows,perl,batch-file,Regex,Windows,Perl,Batch File,如何从正则表达式Perl执行返回匹配的值 我想在批处理文件中进一步使用匹配项 批处理文件: perl -p -e "ab{2}" c:\file.txt REM echo %var% how can I get the result from perl? REM do something with %var% FileFile.txt: abbreviation zb226的更新: test Filename: dynamicFile.txt Property: some propert

如何从正则表达式Perl执行返回匹配的值

我想在批处理文件中进一步使用匹配项

批处理文件:

perl -p -e "ab{2}" c:\file.txt
REM echo %var% how can I get the result from perl?
REM do something with %var%
File
File.txt

abbreviation

zb226的更新:

test

Filename: dynamicFile.txt
Property: some property to neglect
Message: the message I want
Time: dynamicTime

perl-p-e“s/^(ab{2})。*$/\1/”c:\file.txt

您需要
FOR
命令:

@ECHO OFF
FOR /F "delims=" %%I IN ('perl -ne "print $1.\"\n\" if ~/(ab{2})/" c:\file.txt') DO SET match=%%I
ECHO match: %match%
请注意,这将返回最后一个匹配项-这与示例regexp
ab{2}
无关,因为它将始终返回
abb
或什么都不返回

编辑1:忘记在perl联机程序中添加换行符-或者您可以使用Andrey的
perl-pe…
版本,该版本不需要打印换行符

编辑2:然后,Andrey的一行代码只在一行的开头匹配regexp,这不是您的问题所建议的。正如您已经注意到的,它还会打印不匹配的线条。我想不出一个简单的方法来修复
perl-pe
版本

编辑3:对于您在评论中提供的其他信息,这里有一个快速而肮脏的解决方案

@ECHO OFF
FOR /F "usebackq delims=" %%I IN (`perl -e "local $/ = undef; open my $h, '<', $ARGV[0]; my $x = <$h>; print $1 if $x=~/Filename: dynamicFile.txt.*?Message: (.*?)Time/s;" c:\file.txt`) DO SET match=%%I
ECHO match: %match%
……这将产生:

match: the message I want

这一行程序只返回打印到标准输出的文件内容。如果您打开了警告,它还将打印
在-e第1行没有包或对象引用的情况下无法调用方法“ab”。
到stderr。我在那里没有看到任何正则表达式oO!?你不是已经问了这个问题并接受了答案吗?@ikegami的解决方案在我看来很好:@TLP类似,但我问了打印输出/标准输出,我现在尝试扩展它。这将只打印整个文件内容。但我要找的只是要返回的匹配项。仅此打印abb,您匹配的是什么?很好,在我的示例中,它确实有效。尽管我很难将它移植到我的案例中。也许你可以再帮我一个<代码>(文件名:dynamicFile.txt.*?消息:\K.*(?=\sTime))是我要计算的表达式。文件内容是:
Filename:dynamicFile.txt属性:忽略某些属性消息:消息我想要时间:dynamicTime
。我尝试使用,但当我在perl oneliner中使用该模式时,%match%只是空的。为什么?这是因为您的匹配跨越多行,这将需要一种不同(且更复杂)的方法。哦,不,我刚刚发现,如果“Filename”字符串正好位于空行之后,则匹配为空。我用filecontent示例更新了我的答案,但该示例不起作用。也许你知道可能出了什么问题。这很奇怪,因为无论如何使用它都是有效的。但是使用我的本地perl v5.16.2它与任何东西都不匹配。嗯,这是我的一个错误,
local$/='
必须是
local$/=undef
-然后它就工作了!正确答案。。。
match: the message I want
perl -lne "print $1 if /(ab{2})/" C:\file.txt