Perl一个班轮比赛重复自己

时间:2011-11-30 22:02:08

标签: perl pcre

我正在尝试使用Perl读取文件中某一行的特定部分。 有问题的文件具有以下语法。

# Sets $USER1$ 
$USER1$=/usr/....
# Sets $USER2$ 
#$USER2$=/usr/...

我的oneliner很简单,

perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file

出于某种原因,我正在多次重复提取1美元的提取,显然是在匹配发生后文件中的每一行一次。我在这里缺少什么?

4 个答案:

答案 0 :(得分:5)

您正在为文件的每一行执行打印,因为每个行都会调用print,无论正则表达式是否匹配。将第一个;替换为&&

答案 1 :(得分:2)

来自perlre:

注意:Perl中的失败匹配不会重置匹配变量,这样可以更轻松地编写测试一系列更具体案例的代码,并记住最佳匹配。

请改为尝试:

perl -ne 'print "$1" if m/^\$USER1\$\s*=\s*(\S*?)\s*$/m;' /my/file

答案 2 :(得分:1)

$ cat test.txt
# Sets $USER1$ 
$USER1$=/usr/....
# Sets $USER2$ 
#$USER2$=/usr/...

$ perl -nle 'print if /^\$USER1/;' test.txt
$USER1$=/usr/....

答案 3 :(得分:0)

试试这个

perl -ne '/^.*1?=([\w\W].*)$/;print "$1";' file