Perl正则表达式:删除所有内容(包括换行符),直到找到匹配项

时间:2011-06-08 14:15:46

标签: regex perl

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

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

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

但这不起作用。

由于

5 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:3)

尝试使用:

如果你想要摆脱最后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

答案 2 :(得分:1)

尝试类似:

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

答案 3 :(得分:0)

你还没有说是否要保留By.unanimous.vote部分,但听起来像你想要的那样:

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

请注意丢失的g标记和惰性*?量词,因为您希望在点击该字符串后停止匹配。这应该保留By.unanimous.vote以及之后的所有内容。 [\s\S]匹配换行符。在Perl中,您也可以使用:

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

答案 4 :(得分:0)

使用awk的解决方案

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