文本文件行处理,8进制数据替换成16进制

使用gawk 完成,由shell 查找所有需要处理的文件,然后通过管道送给awk处理,awk 一个文件一个文件处理,故使用了BEGINFILE 和ENDFILE 两个模式,即在文件开始处理之前生成一个临时文件,用来存储awk 处理之后输出的内容(awk 中使用重定向输出到临时文件);文件处理之后判断是否需要替换原来的文件。


使用时可以单个文件处理,即awk -f FILE.awk   yourfile;也可以同时处理多个文件,使用shell 命令: 


find -name PATTERN_NAMES | xargs awk -f FILE.awk



所有代码如下:


#!/bin/awk
BEGIN {
    FS = ":"
}

BEGINFILE {
    tmp_name = FILENAME "__tmp.sig__";
    same_file = 1;
    system ("rm -f " tmp_name);
    system ("touch " tmp_name);
}

{
    if ($1 == "regex" && match($2, "\\\\[0-9][0-9][0-9]")) {
        same_file = 0;
        left = $2;
        result = "";
        do {
            len = length(left);
            if (RSTART > 1) {
                result = sprintf("%s%s", result, substr(left, 1, RSTART - 1));
            }
            hex = sprintf("0%s", substr(left, RSTART + 1, RLENGTH - 1));
            result = sprintf("%s\\x%x", result, strtonum(hex));
            len += 1;
            left = substr(left, RSTART + RLENGTH, len - RSTART - RLENGTH);
        } while (match(left, "\\\\[0-9][0-9][0-9]"));

        result = sprintf("regex:%s%s", result, left);
        print result >> tmp_name;
    }
    else {
        print $0 >> tmp_name;
    }
}

ENDFILE {
    if (same_file == 0) {
        system ("mv " tmp_name " " FILENAME);
    }
    same_file = 1;
    system ("rm -f " tmp_name);
}


你可能感兴趣的:(文本文件行处理,8进制数据替换成16进制)