使用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);
}