Regex Perl正则表达式:删除所有内容(包括换行符),直到找到匹配项
为这个简单的问题道歉。我不经常清理文本或使用正则表达式 我有大量的文本文件,我想删除其中的每一行,直到我的正则表达式找到匹配项为止。在我找到匹配之前,通常会有15行绒毛。我希望有一个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
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行包含一致投票的?