从C文件中删除TODO行

时间:2018-01-29 16:30:56

标签: shell sed replace scripting grep

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

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

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

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

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

由于

3 个答案:

答案 0 :(得分:2)

仅删除以//使用^开头的行。

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

要替换使用s而不是d

同时注释无评论的行
sed 's#//.*TODO.*##'

将这些与一个sed命令中的find结合起来

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

现在你可以在同一个sed中处理空间和Fixme,但它有点长:

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

答案 1 :(得分:2)

就我个人而言,我只是简单地使用awk:

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

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

就像GNU sed支持使用-i进行“inplace”编辑一样,带有-i inplace的GNU awk也是如此,因此如果您愿意,可以在find命令中使用它:

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

答案 2 :(得分:1)

另一个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