使用sed重写代码(搜索和替换)

时间:2018-01-17 10:27:00

标签: php bash shell sed

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

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 ...,即第一个代码段将缩减为:

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

和第二个:

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

注意:

    如果没有,可能会丢失
  • array(/* parameters */) 参数存在。
  • $stmt可能有其他名称(例如$foo)。

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

注意:如果这对于sed或类似的工具来说过于复杂,我会接受一个答案,该答案指向另一个有助于避免手动重写所有这些陈述的工具。

1 个答案:

答案 0 :(得分: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无法做到。你需要为此编写一种解析器。