如何删除特定字符前后的文本?

时间:2008-12-12 11:26:47

标签: regex perl

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

由于

5 个答案:

答案 0 :(得分:3)

我会用这个:

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

答案 1 :(得分:2)

您不需要软件,您可以将此部分作为现有脚本。多行正则表达式替换/ a(b)c /然后您可以使用$ 1对替换器中的b进行反射。如果不了解您正在使用的文本的更多信息,很难猜出实际模式会是什么。

答案 2 :(得分:2)

假设您有以下内容:

  

text1 text2 keyword text3 text4 text5 keyword text6 text7

你想要的是

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

否则你只需用关键字

替换整行

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

答案 3 :(得分:1)

我会说,如果$ text包含你的全文,你可以这样做:

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

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

答案 4 :(得分:0)

假设您要删除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扩展名,使用带打印的隐式while循环,并在每次打印前执行搜索和替换模式。

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