为这个简单的问题道歉。我不经常清理文本或使用正则表达式。
我有大量的文本文件,我想删除每一行,直到我的正则表达式找到匹配项。在找到比赛之前,通常会有大约15行绒毛。我希望有一个看起来像这样的perl单行:
perl -p -i -e "s/.*By.unanimous.vote//g" *.txt
但这不起作用。
由于
答案 0 :(得分:4)
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