【问题标题】:Removing TODO lines from C files从 C 文件中删除 TODO 行
【发布时间】:2018-07-08 10:05:30
【问题描述】:

我有几个 .c 和 .h 文件,它们在内部包含 TODO 和 Fixme 消息。 我想使用 shell 脚本删除它们。 问题是 TODO 或 Fixme 消息可以在一行中,也可以与代码在同一行中。

// TODO : single line todo
// Fixme : single line fixme
if(test != 0) // Fixme : code line fixme

我可以使用 find & sed 编写一个 shell 命令来删除单行 TODO 消息,如下所示;

find . -name "*.h" -exec sed -i '/TODO/d' {} \;

我也需要一个技巧来删除代码行 fixme。

谢谢

【问题讨论】:

  • sed -i 's#\(.*\)//.*\(TODO\|Fixme\).*#\1#'
  • @SamuelKirschner 谢谢你,这很有帮助!

标签: shell sed replace scripting grep


【解决方案1】:

为了简单起见,我个人只是使​​用 awk:

$ awk 'sub("// (TODO|Fixme) .*","") && !NF{next} 1' file
if(test != 0)

上面只是说“删除以'//'开头的文本,然后是'TODO'或'Fixme',如果结果行为空,则删除它”我认为这正是你想要的。没有复杂性,没有重复的条件,它适用于任何 UNIX 机器上任何 shell 中的任何 awk。

就像 GNU sed 支持使用 -i 进行“就地”编辑一样,GNU awk 和 -i inplace 也是如此,因此您可以根据需要在 find 命令中使用它:

find . -name "*.h" -exec awk -i inplace 'sub("// (TODO|Fixme) .*","") && !NF{next} 1' {} +

【讨论】:

    【解决方案2】:

    另一个 sed 来做这项工作:

    sed -Ei '/^$/n;s/(^|\;)[/]{2}[ ]*(TODO|Fixme).*$/\1/;/^$/d' file
    

    您可以使用exec..+ 集成文件并一次性运行sed

    find . -name "*.h" -exec sed -Ei '/^$/n;s/(^|\;)[/]{2}[ ]*(TODO|Fixme).*$/\1/;/^$/d' {} +
    

    提示: -E 选项与 sed 启用扩展正则表达式引擎。如果不支持,请使用-r

    【讨论】:

      【解决方案3】:

      只删除以 // 开头的行,请使用^

      sed '/^\/\/.*TODO/d'
      

      要替换既有注释又有无注释的行,请使用s 而不是d

      sed 's#//.*TODO.*##'
      

      将这些与 find 组合到一个 sed 命令中

      find . -name "*.h" -exec sed -i '/^\/\/.*TODO/d;s#//.*TODO.*##' {} \;
      

      现在您可以在同一个 sed 中处理空格和 Fixme,但是会有点长:

      find . -name "*.h" -exec sed -i '/^ *\/\/.*\(TODO\|Fixme\)/d;s# *//.*\(TODO\|Fixme\).*##' {} \;
      

      【讨论】:

        猜你喜欢
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多