出于某种原因,这个正则表达式
perl -ne 'print "$1\n" if /\\includegraphics\[[^\]]*\]\{([^\}]*)/g' test.tex
在我提供时不会全局搜索
\centerline{\includegraphics[height=70mm]{FIGS/plotTangKurve3}\includegraphics[height=70mm]{FIGS/plotTangKurve2}\includegraphics[height=70mm]{FIGS/plotTangKurve1}}
\centerline{\includegraphics[height=70mm]{FIGS/plotTangKurve3}\includegraphics[height=70mm]{FIGS/plotTangKurve2}\includegraphics[height=70mm]{FIGS/plotTangKurve1}}
只输出
FIGS/plotTangKurve3
FIGS/plotTangKurve3
我希望得到的是
FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1
FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1
问题
有人能看出为什么会这样吗?
答案 0 :(得分:3)
您需要while
代替if
。
请参阅http://perldoc.perl.org/perlretut.html#Global-matching
/g
进行全局匹配,但这意味着每次连续匹配都会返回一个新值。因为您使用if
,所以您只评估一次正则表达式,而不会尝试后续的潜在匹配。如果您在那里使用while
,则会重新评估它,直到失败为止。
换句话说:
perl -ne 'print "$1\n" while /\\includegraphics\[[^\]]*\]\{([^\}]*)/g' test.tex
这为我提供了你想要的输出。
答案 1 :(得分:1)
$1
仅指(最多)一场比赛。解决此问题的一种方法是捕获并打印每行上的所有匹配项:
perl -ne 'print "$_\n" for /\\includegraphics\[[^\]]*\]\{([^\}]*)/g'
或
perl -nE 'say for /\\includegraphics\[[^\]]*\]\{([^\}]*)/g'
答案 2 :(得分:0)
要搜索某些文字,最好将grep
与PCRE
选项一起使用:
grep -oP '\\includegraphics\[[^\]]*\]{\K[^{}]+' file
FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1
FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1
\K
用于重置匹配的信息。