转载自:
1. 过滤unix风格配置文件的注释(以#表示注释的开始)以及空白行
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) |