【问题标题】:perl multiple line replace of variable length methodperl多行替换变长方法
【发布时间】:2017-02-10 06:21:57
【问题描述】:

您能否提供一个 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

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 提前致谢。我用迄今为止尝试过的几件事更新了这个问题。
  • * 在正则表达式中通常意味着零个或多个——因为空格是可选的,所以你的正则表达式中不需要* 吗?或者如果它必须是零或一而不是零或多,则使用?
  • 谢谢,在问题上的努力会导致在答案中的努力:)

标签: regex perl


【解决方案1】:
  • ()[]{} 在正则表达式模式中具有特殊含义。如果要匹配这些字符,则需要在模式中对它们进行转义。
  • 您需要在 -(void) 之间留有空格,即使您指出它应该是可选的。
  • 您只匹配您说要匹配多行的一行。
  • -0777 实际上是 slurp 模式,而不是 -0
  • 我没有得到那些报价?!?!

所以,

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

【讨论】:

  • 非常感谢ikegami!这就像一个魅力,非常有帮助。我比你知道的更感激!
【解决方案2】:

我不会为您的问题提供完整的解决方案,但我想指出一种在此类情况下可能会有所帮助的技术。

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

在标量上下文中,“..”返回一个布尔值。运营商是 双稳态,像触发器一样,模拟行范围(逗号) sed、awk 和各种编辑器的操作员。每个“..”运算符 保持其自己的布尔状态,即使跨调用子程序 包含它。只要它的左操作数是假的,它就是假的。 一旦左操作数为真,范围运算符保持为真,直到 右操作数为真,之后范围运算符变为假 再次。

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

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

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

【讨论】:

  • 换句话说,OP 可以使用perl -ne'print if !(/-[ ]?\(void\)dealloc/ .. /^}/);',除非它不会检查[super dealloc];
  • 是的。在我的回答开始时,我应该说,我想提到一种在类似上下文中有用的技术
  • 停止讽刺。我的评论不是批评。它实际上解决了您的问题的两个问题:您没有展示如何使用它,并且您没有解释是什么问题使 OP 难以利用您的“解决方案”。但是,如果您想要评论,这里有一个:如果您想发布问答,那就这样做;不要劫持别人的问题。然后,人们实际上可以链接到它!
  • 非常感谢您的回答。我使用了以下解决方案,但感谢您抽出宝贵时间。
  • @ikegami 没有讽刺意味,真的。你是对的,我的回答可能表明它没有满足其中一项要求。信不信由你,这是为 OP 提供有用提示的尝试。我不知道我在这里违反了某些规则或政策。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2012-03-29
  • 1970-01-01
  • 2010-11-05
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多