Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988455
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-07-17 17:27:12

转载自:


1.  过滤unix风格配置文件的注释(以#表示注释的开始)以及空白行

CODE:
function strip_comments()
{
        local file;
        if [ -z "$1" ]; then
                file=/dev/fd/0;
        else
                file="$1";
        fi
        gawk '
{
        rc = match($0, /([^#]*)#/, m);
        if( rc > 0 )
                line = substr($0,m[1,"start"],m[1,"length"]);
        else
                line = $0;
        if( line !~ /^[[:blank:]]*$/ )
                print line;
}' "$file"
}

(1)local file: bash可以使用local 来声明一个局部量,这样就可以解决递归调用时各个function互相影响的问题,毕竟shell里面的function没有c语言里的stack机制。
(2)如果没有指定输入,就将标注你输入/dev/fd/0作为输入
(3)match函数对输入的整行进行处理,并将匹配结果放到数组m的0下标中,由于pattern中有(),因此,括号中匹配的内容依次放入数组m中,从下表1开始,而gawk又扩展了对数组的使用,即m[1,"start"]和m[1,"length"]分别表示第一次匹配()中内容的字串在原来字符串中的起始位置(1 based),和该串的长度。这里()里面是用来匹配#前面的内容的,这些内容是要保留的,因此付给line,而如果这行没有#,那么整行都是要保留的,因此line=$0。
   然后判断line是否匹配(!~)空白行,~是匹配,!~是不匹配,如果不是空白行就输出到标准输出。
阅读(3841) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~