[转载]Shell删除各种注释的脚本

摘要:
>但是,如果您希望从文件开头扩展到<“tester$sed-e”{;begin;{$;<可以使用以下命令sed-e“;”2.txt。内容如下;a;N;ba};当处理aabbcc<bbegin&lt&lt,>/;s开始{$;{N;};乞求

转自:http://www.cppblog.com/zhangyq/archive/2010/10/08/127915.html

1.txt内容:
file content
  aabbcc<<<comment part 1
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扩展到<<<出现为止,buffer中要处理的字符串可能会很长,影响效率。所以去掉这个处理范围也是能够得到正确结果的,

    • ,比如:

      $ sed -e ":begin; { />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
      or
      $ sed -e "{:begin;  />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
      
    • />>>/!>>>是要替换内容的结束标记,带上!就是说当一行处理完毕之后,如果没有发现结束标记。。。

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

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

    • b begin,由于仍然没有找到结束标记<<<(注意上一条说的缓冲区还没有被处理),所以在这里跳回到标号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 "/^[ ]*///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 "/^[ ]*/*/,/.**//d" test.conf
      sed -i 's##.*# #' $filename
      sed -i ":begin; { /*//! { $! { N; b begin }; }; s//*.**// /; };"  $filename
      sed -i '/^$/d' $filename

免责声明:文章转载自《[转载]Shell删除各种注释的脚本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇录音 voice record通过internet网络唤醒主机的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

11.ThinkPHP分页

分页实现 ThinkPHP5.1内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用paginate方法: 官方Demo // 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->paginate(10); // 把分页数据赋值...

04 . Jenkins部署Java项目

配置基础环境 注意: 安装使用Jenkins和Gitlab请先看前面文章,此处不详细介绍 https://www.cnblogs.com/you-men/p/13126873.html Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是需要编译和打包的,一般情况下编译和打包都是用maven完成,所以系统环境中需要安装maven。...

bootstrap 导航栏、输入框按钮组、栅格系统

栅格系统 文档地址:http://v3.bootcss.com/css/#grid 栅格系统的强大之处在于灵活的处理不同分辨率下的页面布局,对于我这种理科思维并且是前端弱鸡的人来说,优点在于可预见、可控,同时最大限度的减少了页面布局过程中的代码量,实乃神器。 举例说明: <div class="container-fluid">...

JBoss配置连接池

         什么是数据库连接池?          配置连接池为的是解决效率问题.由于每创建一个连接都是非常耗时的,有了连接池,就能够提前放一些连接进去.以后我们再用连接就去连接池里面取而不是每次都创建.可是我们知道连接池是有上限的,假设仅仅同意我们放10个,那么当这10个连接都被占用的时候,下一个用户再来请求连接将不能得到,仅仅好等待,假设等的时...

使用eclipse将maven项目部署tomcat, 以及如何实现热部署

在以前,我每次部署项目的时候都是关闭tomcat并开启tomcat,完成代码的编译并部署到tomcat上,现在想想,感觉当时怎么不去了解去如何部署到tomcat有几种方式,elispe 创建的web项目部署到tomcat的原理。若是了解了,估计很多时间都不会停留在关闭和开启tomcat上吧,当然这里也是说说而已。 目前,我是想把maven项目web工程部署...

HTML和CSS的分离

  特别声明:此篇文章由Jekst根据Jonathan Snook的英文文章原名《Decoupling HTML From CSS》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://coding.smashingmagazine.com/2012/04/20/decouplin...