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

Regex Perl正则表达式:删除所有内容(包括换行符),直到找到匹配项,regex,perl,Regex,Perl,为这个简单的问题道歉。我不经常清理文本或使用正则表达式 我有大量的文本文件,我想删除其中的每一行,直到我的正则表达式找到匹配项为止。在我找到匹配之前,通常会有15行绒毛。我希望有一个perl一行程序,如下所示: perl -p -i -e "s/.*By.unanimous.vote//g" *.txt 但这不起作用 谢谢尝试一下: 如果你想在最后一次投票前获得一致通过,请投票 perl -00 -pe "s/.*By.unanimous.vote//s" inputfile > out

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

我有大量的文本文件,我想删除其中的每一行,直到我的正则表达式找到匹配项为止。在我找到匹配之前,通常会有15行绒毛。我希望有一个perl一行程序,如下所示:

perl -p -i -e "s/.*By.unanimous.vote//g" *.txt
但这不起作用

谢谢

尝试一下:

如果你想在最后一次投票前获得一致通过,请投票

perl -00 -pe "s/.*By.unanimous.vote//s" inputfile > outputfile
perl -00 -pe "s/.*?By.unanimous.vote//s" inputfile > outputfile
如果你想在第一次投票前获得一致通过,请投票

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

你还没有说你是否想保留
部分,但我觉得你想:

s/[\s\S]*?(?=By\.unanimous\.vote)//
请注意缺少的
g
标志和lazy
*?
量词,因为您希望在点击该字符串后停止匹配。这应该通过一致投票来保存
,以及之后的所有内容。
[\s\s]
匹配换行符。在Perl中,您还可以通过以下方式执行此操作:

s/.*?(?=By\.unanimous\.vote)//s
尝试以下方法:

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=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
使用awk解决方案

awk '/.*By.unanimous.vote/{a=1} a==1{print}' input > output
解决方案使用:

较短的解决方案,也使用:


它以什么方式不起作用?包括或排除匹配的行?这些字符应该是
By.consenous.vote
中的文字
字符,还是应该转义?1。我发布的表达式只删除匹配之前但在同一行的文本。它不会删除前面的行。2.对我的应用程序来说并不重要,但我想我们也可以删除匹配项。3.文字
字符。他们不应该逃脱。谢谢大家的关注!在这种情况下,使用
*?
不带/g和带/s@Qtax:如果OP希望在第一次出现之前删除,则您是对的。您仍然需要/s,没有它,这将无法工作。或者,
是否遵循输入记录分隔符进行[^newline]匹配?@Qtax:
-00
将记录分隔符定义为空,因此无需
/s
@M42,显然
不关心记录分隔符,
perl-00-e“print qq!foo\nbar!=~/(.*)/”
打印
foo
。触发器是如何工作的?我读了链接页面,但对
/pattern/的含义感到困惑。。1
。是否按相反顺序进行,即第1行包含一致投票的