【问题标题】:Rewrite code using sed (search & replace)使用 sed 编写代码(搜索和替换)
【发布时间】:2018-01-17 10:27:00
【问题描述】:

我在代码库中有数百条这样的语句:

if ($stmt->execute(array(/* parameters */))) {
    $att = $stmt->fetchAll(); /* or any other fetch method */
} else {
    throw new DatabaseException(__METHOD__.": failed");
}

另一个不获取任何数据的变体:

if (!$stmt->execute(array(/* parameters */))) {
    throw new DatabaseException("Error");
}

在这两种情况下,if ...throw ... 都应该被删除,即第一个 sn-p 将被缩减为:

$stmt->execute(array(/* parameters */));
$att = $stmt->fetchAll(); /* or any other fetch method */

第二个:

$stmt->execute(array(/* parameters */));

注意:

  • 如果没有,array(/* parameters */) 可能会丢失 存在的参数。
  • $stmt 可能有另一个名字(如$foo)。

背景:我希望 PDO 在发生错误时抛出异常,而不是大量自定义代码。目前它被设置为静默忽略错误,这需要大量额外的检查......

注意:如果这对于 sed 或类似工具来说太复杂了,我将接受指向另一个工具的答案,该工具可以帮助避免手动重写所有这些语句。

【问题讨论】:

  • 好的,你为自己做了哪些努力?
  • 我搜索了类似的问题(和解决方案),但没有找到像我这样复杂的示例。另外,由于我不熟悉sed 和类似工具,我无法调整现有答案来解决我的问题,因为几乎所有答案都只包含解决方案而没有进一步解释。

标签: php bash shell sed


【解决方案1】:
$> cat codes.txt

if ($stmt->execute(array(/* parameters */))) {
  $att = $stmt->fetchAll(); /* or any other fetch method */
} else {
  throw new DatabaseException(__METHOD__.": failed");
}
if (!$stmt->execute(array(/* parameters */))) {
  throw new DatabaseException("Error");
}

$> perl -p0777e 's:(if \(\s*\!?\s*)(.*?)(\s*\)\s*\{\s*)((.*?)\s*\}\s*else\s*\{\s*)?throw .*?;\s*\}:$2;\n$5:g' codes.txt

$stmt->execute(array(/* parameters */));
$att = $stmt->fetchAll(); /* or any other fetch method */
$stmt->execute(array(/* parameters */));

  1. 此解决方案仅适用于非嵌套{} 代码。
  2. 对于嵌套的{},会很困难,我认为regexp 做不到。您需要为此编写一种解析器。

【讨论】:

  • 对于嵌套 {},可以使用递归正则表达式 (?R) 或 (?n),但为了安全起见,必须在 cmets /*{*/ 字符串 "{" 或字符 '{' 内排除 {,注意您的代码将删除所有 if 语句
  • @Mahuel:仅当该语句具有命令 throw 时,它才会删除 if 语句。
  • 谢谢!这应该已经非常接近我需要的了。我应该能够改进正则表达式以适应一些更特殊的情况。如果只需要手动重写 10 条语句,那比重写 500 条要好;)
猜你喜欢
  • 2014-09-13
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多