我有一个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|//[^\*"]*[^"]*||'
答案 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
可以很容易地解决这个问题。