我有几个.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。
由于
答案 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
。