我正在尝试使用Perl读取文件中某一行的特定部分。 有问题的文件具有以下语法。
# Sets $USER1$
$USER1$=/usr/....
# Sets $USER2$
#$USER2$=/usr/...
我的oneliner很简单,
perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file
出于某种原因,我正在多次重复提取1美元的提取,显然是在匹配发生后文件中的每一行一次。我在这里缺少什么?
答案 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