如何全球搜索而不替换?

时间:2017-07-13 11:48:58

标签: regex bash perl

出于某种原因,这个正则表达式

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

问题

有人能看出为什么会这样吗?

3 个答案:

答案 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)

要搜索某些文字,最好将grepPCRE选项一起使用:

grep -oP '\\includegraphics\[[^\]]*\]{\K[^{}]+' file

FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1
FIGS/plotTangKurve3
FIGS/plotTangKurve2
FIGS/plotTangKurve1

\K用于重置匹配的信息。