文本块的选择性打印只有行匹配

时间:2015-02-03 21:08:13

标签: regex perl

我有一个单行程序,可以在两行之间打印行,但是我想添加另一个条件来打印该块,如果有一行符合* .pm:

perl -e 'while(<>){s/^/$ARGV:/; print if m#VLOG {Updated files}# .. m#VLOG {Priority}#;}'

示例数据:

VLOG {Updated files}
files/skel/usr/local/cp/Modules/vsap/config.pm
files/skel/usr/local/cp/Modules/vsap/files/list.pm
files/skel/usr/local/cp/lib/i386-linux-thread-multi/perllocal.pod
files/skel/usr/local/cp/templates/default/cp/files/dirdialog.xsl

VLOG {Removed files}

VLOG {Priority}

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

perl -ne 'BEGIN{ $/ ="VLOG {Priority}$/" } s/^/$ARGV:/gm; print $1 if /^(VLOG {Updated files}.*?\.pm.*)/sm'

答案 1 :(得分:1)

首先,您需要保存可能要打印的行,并在最后打印它们:

perl -e 'while(<>){s/^/$ARGV:/; push @save,$_ if m#VLOG {Updated files}# .. m#VLOG {Priority}#;} print @save;'

现在你要查找以'.pm'结尾的行,只有在看到一行时才会打印:

perl -e 'while(<>){s/^/$ARGV:/; do {push @save,$_; $sawPM = 1 if /\.pm/; } if m#VLOG {Updated files}# .. m#VLOG {Priority}#;} print @save if $sawPM;'