我知道如何删除所有注释或删除文件中指定的行,但不知道如何只删除包含作者,版权等的第一个顶级注释行。我不能只使用删除第一行,因为可能是源文件根本不包含顶部注释块。有什么建议吗?
更新:源文件是objective-c文件,所有热门评论行都以//
开头。可能规则“删除所有注释行直到找到第一个非注释行然后停止”最好地描述了我想要实现的目标。
第二个问题:另外,寻找一种方法告诉sed以递归方式循环所有项目目录和文件。
UPDATE2 即可。这是我试图修改的objective-c文件的注释块的一个例子:
//
// MyProjectAppDelegate.m
// MyProject
//
// Created by Name Surname on 2011-09-20.
// Copyright 2012 JSC MyCompany. All rights reserved.
//
答案 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'