-1

如何从正则表达式 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.txt

abbreviation

zb226 更新:

test

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

3 回答 3

1

你需要这个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 onliner 中添加换行符 - 或者您可以使用 Andrey 的perl -pe ...版本,它不需要打印换行符。

编辑2:再说一次,安德烈的单行只在一行的开头匹配正则表达式,这不是你的问题所暗示的。正如您已经注意到的,它还会打印不匹配的行。我想不出一个简单的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%

带有一个测试文件...

test

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

...这输出:

match: the message I want
于 2013-02-20T15:02:16.167 回答
0

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

于 2013-02-20T14:51:55.790 回答
0
perl -lne "print $1 if /(ab{2})/" C:\file.txt
于 2013-02-20T17:16:01.203 回答