如何用sed删除Java项目的注释?

时间:2015-09-09 16:59:15

标签: java bash sed

我有一个Java项目,其中我有JavaDoc注释

/** ... */

其他多行评论

/* ... */

行评论

// ...

和我自己的"解释性评论"

//* ...

当我发布我的代码时,我希望删除所有行注释 - 而不是其他注释。我虽然我会用sed做,但到目前为止我还没有成功。我正在尝试以下方法:

#!/bin/bash

while read -d $'\0' findfile ; do
  echo "${findfile}"
  mv "${findfile}" "${findfile}".veryold
  cat "${findfile}".veryold | sed -e 's|//[^\*"]*[^"]*||' -e 's/[ ^I]*$//' | grep -A1 . | grep -v '^--$' > "${findfile}"
  rm -f "${findfile}".veryold
done < <(find "${1}" -type f -print0)

出错了什么?请注意,//中的"..."不应被删除,因为它们可能是网址的一部分。

关键部分是

-e 's|//[^\*"]*[^"]*||'

1 个答案:

答案 0 :(得分:0)

对于看起来像这样的测试文件:

/** This should stay */
/* And this
 * should stay
 * as well */
// This one should be removed
//* But this one should stay
code here // This part should go, but not the next line
"http://test.com"
code here //* This should stay
你可以这样做:

$ sed '\#^//[^*]#d;s#//[^*"][^"]*$##' test.java
/** This should stay */
/* And this
 * should stay
 * as well */
//* But this one should stay
code here
"http://test.com"
code here //* This should stay

第一个表达式\#^//[^*]#d删除所有以//开头的行(但不是//*)。这是为了避免在删除整行时在输出中出现空行。

第二个表达式s#//[^*"][^"]*$##//匹配(但不是//*//"),直到行尾,除非有{" 1}}在//和行尾之间。

您的表达式s|//[^\*"]*[^"]*||几乎完全相同,除了:

  • 无需转义括号表达式中的字符; [\*]\*匹配。
  • 您希望第一个括号表达式只匹配一次,而不是零次或多次;你的表达 匹配//*
  • 您不会在该行的末尾停泊,因此这些表达式会在所有地方匹配//并将其删除,即使后跟"*

对于行尾的零长度注释的特殊情况,

code here //

如果您要删除//,则必须添加第三个替换s#//$/#,因为现有的替换//后至少需要一个字符s/[[:space:]]*$/$/ }。

请注意这不是超级干净,因为它可能会在行尾留下无用的空格,但_L可以很容易地解决这个问题。