shell删除java多行注释,Shell删除各种注释的脚本

1.txt内容:

file content

aabbcc<<

abcdefg

hilkdifdfdf

mmmmmmmm

eeeeeeeeeeeeee

comment part 2>>>

ddeeff

sed -e ":begin; /<<,/>>>/ { />>>/! { $! { N; b begin }; }; s/<<<.>>>/ /; };" 1.txt

file content

aabbcc

ddeeff

首先花括号{}代表命令块的开始,类似c的语法,后面就不再说了。

:begin,这是一个标号,man中叫做label,也就是跳转标记,供b和t命令用,本例中使用了b命令。

/<<,/>>>/,这是一个地址范围(Addresses),后面{}中的命令只对地址范围之间的内容使用。其中逗号前面的部分是开始地址,逗号后面是结束地址,都是正则表达式。由于sed是“流”式“行”处理,所以结束地址是可以省略的,即如果地址的结束范围不存在,那么将一直处理到文件结尾。本例中使用这个地址范围主要是缩小处理的数据量,因为虽然后面用N命令把对一行的处理扩展为了多行,但如果从文件开头一直N扩展到<<

,比如:

$ sed -e ":begin; { />>>/! { $! { N; b begin }; }; s/<<<.>>>/COMMENT/; };" test

or

$ sed -e "{:begin; />>>/! { $! { N; b begin }; }; s/<<<.>>>/COMMENT/; };" test

/>>>/!,>>>是要替换内容的结束标记,带上!就是说当一行处理完毕之后,如果没有发现结束标记。。。

$!,$在正则中表示字符串结尾,在sed中代表文件的最后一行,本句和上一句结合起来的意思就是:如果在本行没有发现结束标记,并且当前扫描过的行并不是文件的最后一行。

N;,把下一行的内容追加(append)到缓冲区(pattern)之后,在我们的例子中,在处理aabbcc<<>>一起放入缓冲区,相当于“合并”成了一行(sed的缓冲区中默认都只会包含一行的内容)。

b begin,由于仍然没有找到结束标记<<

s/<<<.>>>/COMMENT/;,终于,/>>>/!不再匹配成功,也就是我们已经找到了结束标记,那么用s命令来进行替换。如果开始和结束标记在一行的话,就会越过上面那些复杂的处理,直接执行到这里了

如果要删除标c里的注释:可用如下命令

sed -e ":begin; { /\*\//! { $! { N; b begin }; }; s/\/\*.*\*\// /; };" 2.txt

2.txt内容如下:

file content

aabbcc/*comment part 1

abcdefg

hilkdifdfdf

mmmmmmmm

eeeeeeeeeeeeee

comment part 2*/

ddeeff

执行命令结果如下:

file content

aabbcc

ddeeff

sed '/\/\*/{/\*\//d;:a;N;/\*\//d;ba};s,//.*,,' 2.txt会把上面的aabbcc那一行删掉

上面的命令适合于注释多行,代码和注释行没有在一行,用sed -e ":begin; { /\*\//! { $! { N; b begin }; }; s/\/\*.*\*\// /; };" 会导致出现一个空行

如果是下面的情况也没有问题

file content

aabbcc

/*comment part 1

abcdefg

hilkdifdfdf

mmmmmmmm

eeeeeeeeeeeeee

comment part 2*/ddeeff

执行sed -e ":begin; { /\*\//! { $! { N; b begin }; }; s/\/\*.*\*\// /; };" 结果还是

file content

aabbcc

ddeeff

不过还是有空行,所以如果要删除C注释用sed -e ":begin; { /\*\//! { $! { N; b begin }; }; s/\/\*.*\*\// /; };" 比较合适,然后在删除空行就行

sed /^$/d        filename        删除空行,实际应用中可以把-e参数换成-i,这样就可以直接对源文件进行操作和修改了;

以下是删除各种标c和c++,还有shell脚本本身的注释#的脚本

#delete the comment line begin with '//comment'

sed -i "/^[ \t]*\/\//d" $filename

#delete the commnet line end with '//comment'

sed -i "s/\/\/[^\"]*//" $filename

#delete the comment only occupied one line '/* commnet */'

sed -i "s/\/\*.*\*\///" $filename

#delete the comment that occupied many lines '/*comment

#                                              *comment

#                                              */

sed -i "/^[ \t]*\/\*/,/.*\*\//d" test.conf

sed -i 's#\#.*# #' $filename

sed -i ":begin; { /\*\//! { $! { N; b begin }; }; s/\/\*.*\*\// /; };"  $filename

sed -i '/^$/d' $filename

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值