zoukankan      html  css  js  c++  java
  • [转载]Shell删除各种注释的脚本

    转自: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

  • 相关阅读:
    Ternsorflow 学习:002-Tensorflow 基础知识
    Ternsorflow 学习:001-通过例程,初步了解Tensorflow
    Wpa_supplicant 调试故障原因分析
    Ternsorflow 学习:000-在 Ubuntu 16.04 上安装并使用 TensorFlow_v1.14 (改)
    开发工具类(eclipse、安卓SDK) 镜像站
    Linux镜像源 国内列表
    linux桌面系统 镜像下载
    arm linux 移植 udhcp 与 使用
    Docker三剑客之compose
    Docker基础内容之端口映射
  • 原文地址:https://www.cnblogs.com/myyan/p/4849792.html
Copyright © 2011-2022 走看看