【问题标题】:How can I remove the text before and after a particular character?如何删除特定字符之前和之后的文本?
【发布时间】:2008-12-13 02:52:03
【问题描述】:

我一直在尝试删除每行文本中特定字符之前和之后的文本。手动操作非常困难,因为它包含 5000 行,我需要删除每行中该关键字之前的文本。任何可以做到这一点的软件都会很棒,或者任何可以在 Windows 上运行的 Perl 脚本。我在 ActivePerl 中运行 Perl 脚本,因此可以执行此操作并在 ActivePerl 上运行的脚本会很有帮助。

谢谢

【问题讨论】:

  • 你可以举一个输入行和你想要的输出行的例子吗?你的问题有点模棱两可,到目前为止你得到的答案都反映了这一点。

标签: regex perl


【解决方案1】:

我会用这个:

$text =~ s/ .*? (keyword) .* /$1/gx;

【讨论】:

    【解决方案2】:

    您不需要软件,您可以将这部分作为现有脚本的一部分。多行 regex 沿着 /a(b)c/ 的行替换,然后你可以在替换器中用 $1 反向引用 b。如果不了解您正在使用的文本的更多信息,就很难猜测实际的模式是什么。

    【讨论】:

      【解决方案3】:

      假设你有以下几点:

      text1 text2 关键字 text3 text4 text5 关键字 text6 text7

      而你想要的是

      s/.*?keyword(.*?)keyword.*/keyword$1keyword/;
      

      否则你可以用关键字替换整行

      数据的一个例子可以帮助我们更清楚

      【讨论】:

        【解决方案4】:

        我想说,如果 $text 包含你的整个文本,你可以这样做:

        $text =~ s/^.*(keyword1|keyword2).*$/$1/m;
        

        m 修饰符使^$ 看到行的开头和结尾,而不是字符串的开头和结尾。

        【讨论】:

        • 我认为这个行不通,因为.*$ 不会匹配换行符。
        • 当然不会匹配换行符,这就是'/m'的意思,这不是要求的吗?
        • 。将匹配除换行符以外的任何内容。 $ 将在换行符之后或字符串末尾匹配。如果它们之间有换行符(通常是这种情况),它将不匹配。
        • 如果要匹配换行符,请使用适当的修饰符。没什么大不了的。
        【解决方案5】:

        假设您要删除keyword1 左侧的所有文本和keyword2 右侧的所有文本:

        while (<>) {
          s/.*(keyword1)/$1/;
          s/(keyword2).*/$1/;
          print;
        }
        

        将其放入 perl 脚本并像这样运行它:

        fix.pl original.txt > new.txt
        

        或者,如果您只想就地执行此操作,可能同时处理多个文件:

        perl -i.bak -pe 's/.*(keyword1)/$1/; s/(keyword2).*/$1/;' original.txt original2.txt
        

        这将进行就地编辑,将原始文件重命名为具有 .bak 扩展名,使用带有 print 的隐式 while 循环,并在每次打印之前执行搜索和替换模式。

        为了安全起见,请先在没有 -i 选项的情况下验证它,或者至少只在一个文件上验证...

        【讨论】:

          猜你喜欢
          • 2020-07-29
          • 2021-12-19
          • 2019-02-02
          • 2021-12-06
          • 2016-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-13
          相关资源
          最近更新 更多