Perl正则表达式一个衬垫:在匹配前插入换行符,除了以特定文本开头的行?

时间:2015-11-26 04:14:35

标签: regex perl

我正在使用批处理文件进行一些快速的Perl搜索,并用安装了Strawberry Perl v5.22.0的Windows 7上的某些文件替换。

然而,我有一种情况我无法弄清楚该怎么做。

示例文本(如果您想知道奇怪的数据是什么,它与赛马和偏袒有关):

2/2 FIRST PIGEON, A. R. Boyd's, It (D. Mangos) 3 9/9 BROADWAY, M. C. McTigue's, It (S. M. Miller) 4 17/16 CLEM'S PRIZE (WhipsterCrathie), G. D Shand's 
Also started: 13/13 Adele Hanover, 11/12 Apollo King, 12/11 Cushan, 4/4 Fortunate, 6/8 Frosty McCoy. 

我想在第一行的'数字斜线号码'之前添加换行符但是要忽略第二行的所有相同匹配。结果如下:

2/2 FIRST PIGEON, A. R. Boyd's, It (D. Mangos) 3 
9/9 BROADWAY, M. C. McTigue's, It (S. M. Miller) 4 
17/16 CLEM'S PRIZE (WhipsterCrathie), G. D Shand's
Also started: 13/13 Adele Hanover, 11/12 Apollo King, 12/11 Cushan, 4/4 Fortunate, 6/8 Frosty McCoy. 

这些模式在每个文件中多次发生。

因此,在每个数字/数字之前添加换行符很容易

perl -i.bak -pe "s#([0-9]+/[0-9]+.*?)#\n\1#g"  tmpFile

但这当然适用于所有事件。

我用谷歌搜索了几个小时,尝试了各种方法来忽略从开始开始的行上的匹配,但没有成功。我觉得这应该很容易,但看不出怎样,有人能给我看魔法吗?

我需要一个像上面这样的衬里来装入批处理文件。

1 个答案:

答案 0 :(得分:4)

我不明白为什么这么多人试图把所有东西塞进一个正则表达式

只需添加一个条件语句修饰符,就像这样。 (请注意,您应该对捕获组使用$1等,而不是\1等。)

perl -i.bak -pe "s#(\d+/\d+)#\n$1#g unless /^Also started/" tmpFile