【问题标题】:Perl regex one liner: insert newlines before match, except on lines starting with specific text?Perl regex one liner:在匹配之前插入换行符,除了以特定文本开头的行?
【发布时间】:2015-11-26 16:25:22
【问题描述】:

我正在使用批处理文件进行一些快速的 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

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

我已经用谷歌搜索了几个小时,并尝试了各种方法来忽略以 Also started 开头的行上的匹配项,但没有成功。我觉得这应该很容易,但看不到怎么做,有人可以给我看看魔法吗?

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

【问题讨论】:

  • 请注意,您的正则表达式模式中的 .*? 将不匹配任何内容。它是非贪婪的,因此会匹配尽可能少的字符,这里根本不可能匹配
  • 干杯,昨天才发现这个不贪心的东西,还在学习:)

标签: regex perl


【解决方案1】:

我不明白为什么这么多人试图将所有内容都塞进一个正则表达式中

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

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

【讨论】:

  • 太棒了,谢谢。我试图把所有东西都塞进去的原因是我来自使用 'sed' 到 'perl' (由于我在 windows 上可用的 sed 没有非贪婪匹配),我以前对 perl 知之甚少,无法弄清楚在一行/调用中执行此操作的语法,但确实知道如何编写 sed 正则表达式。提示 1 美元。干杯,布莱斯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2012-11-17
  • 2014-07-31
相关资源
最近更新 更多