使用Bash(sed?)删除包含特定文本(正则表达式)的多行/ * ... * /样式注释

时间:2013-11-18 15:19:59

标签: regex bash sed comments

我正在寻找一个bash解决方案来删除一个代码片段,其中包含现在在java类中的/ * ... * / comments中被认为是多余的信息。

具体来说,以前当我们检查我们的代码时,它会自动在课程顶部附近添加一份检查历史记录的副本:

/* Copyright statement */
/*
 * $Log:
 *  3    Project1 02/02/2012 19:05:59    Bob Geldof
 *       Comment 3
 *  2    Project1 01/02/2012 15:25:22    Sir Lancelot
 *       CR-12345
 *  1    Project1 22/10/2011 12:15:31    Thomas the Tank Engine
 *       First implementation of that cool thing
 * $
 */
package com.thing.place.blah
...
...
...

我们现在使用不同的工具来更好地显示这些信息,并且使用重用代码的项目之间的代码比较是一种痛苦,因为时间戳,注释等不同。

目前,如果我们处理一个文件,我们手动删除注释语句和生成该语句的$ Log:关键字,但是我想要做的是编写一个脚本来删除所有java文件。我很好用bash脚本在每个java文件上运行它,但是在正则表达式中有一些我不知道如何实现的技巧。

所以我猜工作流程就像

  1. 在文件
  2. 中查找第一个“$ Log:”
  3. 在此文本之前查找最接近的“/ *”
  4. 在此文本后面找到最近的“* /”
  5. 删除其间的所有文字,包括“/ *”“* /”
  6. 在不删除之前/之后的任何评论的情况下执行此操作(大多数文件将具有上述类似格式的版权声明,可能会在同一行上显示结束评论和开始评论标记,例如“...版权文字的结尾* / / * $ Log:...“
  7. 为了做到这一点,我更喜欢与sed兼容的正则表达式参数,因为这是我熟悉的使用,尽管我会采取你提供的任何东西!此外,如果进行多次传递是有意义的,例如“在开始标记和$ Log:之间删除”,“删除结束标记和$ Log:”,“删除$ Log:”这样就可以了。这是一次性过程,因此速度远不如准确性重要。

    非常感谢任何建议。 米奇。

2 个答案:

答案 0 :(得分:3)

以下内容可能适合您:

sed '/\/\*/!b;:a;/\*\//!{$!{N;ba}};{/$Log:/d}' filename

答案 1 :(得分:2)

#!/usr/local/bin/bash

set -x

find *.java -type f | while read files
do
cat "${files}" | \
sed s'@^/\* Copyright statement \*\/@garbage-begin@' | \
sed s'@ \*\/@garbage-end@' \
> "${files}"2.java

sed '/garbage-begin/,/garbage-end/d' "${files}"2.java > "${files}"3.java
mv -v "${files}"3.java "${files}"
done