Perl oneliner匹配重复自身
我试图用Perl从文件中读取一行的特定部分。 所讨论的文件具有以下语法Perl oneliner匹配重复自身,perl,pcre,Perl,Pcre,我试图用Perl从文件中读取一行的特定部分。 所讨论的文件具有以下语法 # Sets $USER1$ $USER1$=/usr/.... # Sets $USER2$ #$USER2$=/usr/... 我的一行很简单 perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file 出于某种原因,我得到的$1的提取重复了好几次,显然在匹配发生后,文件中的每一行都有一次。我错过了什么?试试这个 perl -ne '/^.*1
# Sets $USER1$
$USER1$=/usr/....
# Sets $USER2$
#$USER2$=/usr/...
我的一行很简单
perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file
出于某种原因,我得到的$1的提取重复了好几次,显然在匹配发生后,文件中的每一行都有一次。我错过了什么?试试这个
perl -ne '/^.*1?=([\w\W].*)$/;print "$1";' file
来自perlre:
注意:Perl中失败的匹配不会重置匹配变量,这使得编写测试一系列更具体情况并记住最佳匹配的代码变得更容易
请尝试以下方法:
perl -ne 'print "$1" if m/^\$USER1\$\s*=\s*(\S*?)\s*$/m;' /my/file
您正在为文件的每一行执行print,因为无论正则表达式是否匹配,每一行都会调用print。更换第一个
用&&
编码>或在每行后重置$1=“”
,但这不太优雅。太完美了,谢谢。我想这是某种逻辑条件问题。@ennuikiller您完全可以轻松重置$1。匹配变量在任何成功匹配时都会重置,因此匹配m//(空字符串)以重置它们!您需要一个条件来测试匹配项,例如print if/。您的正则表达式../代码>
$ cat test.txt
# Sets $USER1$
$USER1$=/usr/....
# Sets $USER2$
#$USER2$=/usr/...
$ perl -nle 'print if /^\$USER1/;' test.txt
$USER1$=/usr/....