【问题标题】:Perl regex: remove everything (including line breaks) until a match is foundPerl 正则表达式:删除所有内容(包括换行符),直到找到匹配项
【发布时间】:2011-09-10 22:20:19
【问题描述】:

为这个简单的问题道歉。我不经常清理文本或使用正则表达式。

我有大量文本文件,我想删除其中的每一行,直到我的正则表达式找到匹配项。在我找到匹配之前,通常有大约 15 行绒毛。我希望有一个看起来像这样的 perl 单行:

perl -p -i -e "s/.*By.unanimous.vote//g" *.txt

但这不起作用。

谢谢

【问题讨论】:

  • 在什么情况下不起作用?
  • 包含还是排除匹配的行?
  • 那些应该是By.unanimous.vote中的文字.字符,还是应该转义?
  • 1.我发布的表达式只删除匹配之前的文本,但在同一行。它不会删除以前的行。 2. 对我的应用程序不是很重要,但我想我们也可以删除匹配项。 3.文字.字符。他们不应该逃脱。感谢大家对此进行调查!

标签: regex perl


【解决方案1】:

使用flip-flop operator的解决方案:

perl -pi -e '$_="" unless /By.unanimous.vote/ .. 1' input-files

同样使用x=!! pseudo operator的更短的解决方案:

per -pi -e '$_ x=!! (/By.unanimous.vote/ .. 1)' input-files

【讨论】:

  • 人字拖是如何工作的?我阅读了链接页面,但对 /pattern/ .. 1 的含义感到困惑。它是否以相反的顺序进行,即包含By.unanimous.vote 的行到第一行?
【解决方案2】:

试一试:

如果你想摆脱直到最后一个By.unanimous.vote

perl -00 -pe "s/.*By.unanimous.vote//s" inputfile > outputfile

如果你想摆脱直到第一个By.unanimous.vote

perl -00 -pe "s/.*?By.unanimous.vote//s" inputfile > outputfile

【讨论】:

  • 在这种情况下使用 .*? 不带 /g 和带 /s
  • @Qtax:如果 OP 想要摆脱直到第一次出现,你是对的。
  • 你仍然需要 /s,没有它这将无法工作。或者. 是否跟在输入记录分隔符之后以匹配其 [^newline]?
  • @Qtax:-00 将记录分隔符定义为空,因此不需要/s
  • @M42,显然. 不关心记录分隔符,perl -00 -e "print qq!foo\nbar! =~ /(.*)/" 打印foo
【解决方案3】:

尝试类似:

perl -pi -e "$a=1 if !$a && /By\.unanimous\.vote/i; s/.*//s if !$a" *.txt

应该删除匹配行之前的行。如果您想删除匹配的行,您也可以执行以下操作:

perl -pi -e "$a=1 if !$a && s/.*By\.unanimous\.vote.*//is; s/.*//s if !$a" *.txt

较短的版本:

perl -pi -e "$a++if/By\.unanimous\.vote/i;$a||s/.*//s" *.txt
perl -pi -e "$a++if s/.*By\.unanimous\.vote.*//si;$a||s/.*//s" *.txt

【讨论】:

    【解决方案4】:

    使用 awk 的解决方案

    awk '/.*By.unanimous.vote/{a=1} a==1{print}' input > output
    

    【讨论】:

      【解决方案5】:

      您还没有说是否要保留 By.unanimous.vote 部分,但在我看来,这听起来像是您想要的:

      s/[\s\S]*?(?=By\.unanimous\.vote)//
      

      请注意缺少的g 标志和懒惰的*? 量词,因为您希望在点击该字符串后停止匹配。这应该保留By.unanimous.vote 及其之后的所有内容。 [\s\S] 匹配换行符。在 Perl 中,您还可以这样做:

      s/.*?(?=By\.unanimous\.vote)//s
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 2014-01-10
        • 2017-02-26
        • 1970-01-01
        • 2019-04-17
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多