如何用sed删除顶部注释行?

时间:2012-09-19 07:50:22

标签: sed

我知道如何删除所有注释或删除文件中指定的行,但不知道如何只删除包含作者,版权等的第一个顶级注释行。我不能只使用删除第一行,因为可能是源文件根本不包含顶部注释块。有什么建议吗?

更新:源文件是objective-c文件,所有热门评论行都以//开头。可能规则“删除所有注释行直到找到第一个非注释行然后停止”最好地描述了我想要实现的目标。

第二个问题:另外,寻找一种方法告诉sed以递归方式循环所有项目目录和文件。

UPDATE2 即可。这是我试图修改的objective-c文件的注释块的一个例子:

//
//  MyProjectAppDelegate.m
//  MyProject
//
//  Created by Name Surname on 2011-09-20.
//  Copyright 2012 JSC MyCompany. All rights reserved.
//

3 个答案:

答案 0 :(得分:2)

如果同时接受awk,请查看以下内容:

 awk 'BEGIN{f=1}f&&/^\/\//{next;}{f=0}1' yourFile

<强>测试

kent$  cat test.txt
//
//  MyProjectAppDelegate.m
//  MyProject
//
//  Created by Name Surname on 2011-09-20.
//  Copyright 2012 JSC MyCompany. All rights reserved.
//
real codes come here...

// comments in codes should be kept

foo bar foo bar


kent$  awk 'BEGIN{f=1}f&&/^\/\//{next;}{f=0}1' test.txt
real codes come here...

// comments in codes should be kept

foo bar foo bar

你可以将find和awk one-liner结合起来进行递归处理。

好的,也可以用同样的想法做到这一点。需要在保留空间中写入标记,并检查每行的保留空间。它具有-i选项的优点,允许您更改原始文件。但是我觉得awk更直接地完成这项工作。将更改后的文本保存回原始文件也不是一件容易的事。

答案 1 :(得分:1)

这是一个与{em> Kent的 sed一起使用的test.txt解决方案:

sed -n '/^ *\/\//! { :a;p;N;s/.*\n//;ba}'

输出:

real codes come here...

// comments in codes should be kept

foo bar foo bar

说明

sed -n '/^ *\/\//!{    # if line does not start with //
  :a                   # label a
  p                    # print line
  N                    # append next line to PS
  s/.*\n//             # remove previous line
  ba                   # branch to a
}' < test.txt

答案 2 :(得分:1)

试一试:

sed '0,\#^\([^/]\|/[^/]\)\|^$# d'