请提供一个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
答案 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的优势在于您不必直接处理内部块,并且对于读取代码的人来说,您的意图更明显。我希望这会有所帮助。