perl多行替换可变长度方法

时间:2017-02-09 21:06:48

标签: regex perl

请提供一个perl脚本或命令,从文件中删除以下代码?在某些情况下,' - '和(void)之间可能存在空格。我尝试了很多变化而没有让它起作用。谢谢!

-(void)dealloc {
    ... could be multiple lines here    
    [super dealloc];
}

以下是我尝试过的几件事:

perl -0777 -pe 's/- (void)dealloc.*\s*.*super dealloc];.*\n}//g' File.txt
perl -i -0pe 's/^'- (void)dealloc'.*\n.*[super dealloc];\n}$//' File.txt
perl -i -0pe 's/^-[ ](void)dealloc.*\n.*[super dealloc];\n}$//' File.txt
perl -i -0pe 's/^-\s(void)dealloc.*\n.*\\'[super dealloc]\';\n}$//' File.txt

2 个答案:

答案 0 :(得分:1)

  • ()[]{}在正则表达式模式中具有特殊含义。如果要匹配这些字符,则需要在模式中转义它们。
  • 您需要-(void)之间的空格,即使您表明它应该是可选的。
  • 您只匹配一条您想要匹配多行的行。
  • -0777实际上是诽谤模式,而不是-0
  • 我没有得到这些报价?!?!

所以,

perl -i -0777pe's/^-[ ]?\(void\)dealloc.*?\[super dealloc\];\s*\}\n//msg' file
  • /m使^在行的开头匹配,而不是(仅)在字符串的开头。
  • /s允许.匹配换行符。
  • ?[ ]?可选地匹配空格。 (后者更容易阅读。)
  • .*?匹配该位置的最少可能。

答案 1 :(得分:0)

我不打算为你的问题提供一个完整的解决方案,但我想指出一种可能在这些背景下有用的技术。

它基于Perl中..运算符的一个不太知名的行为。在标量上下文中,它充当双稳态布尔运算符。让我引用the documentation

  

在标量上下文中,“..”返回一个布尔值。运营商是   双稳态,如触发器,并模拟行范围(逗号)   sed,awk和各种编辑的运营商。每个“..”运算符   即使在调用子例程时,它也会保持自己的布尔状态   包含它。只要其左操作数为假,它就是假的。   一旦左操作数为真,范围运算符将保持为真,直到   右操作数为true,范围运算符变为false   试。

这意味着您可以用更具表现力的方式编写解决方案,例如:

if ( /-[ ]?\(void\)dealloc/ .. /^\}/ ) {
  ... this code is executed when you enter the block ...
}

IMO的优势在于您不必直接处理内部块,并且对于读取代码的人来说,您的意图更明显。我希望这会有所帮助。