我正在重构代码,并且已经在我的c'中创建了结构。我需要重新标记的代码。例如:
static const unsigned char glyph_065[] = {
...
};
static const unsigned char glyph_066[] = { ... };
static const unsigned char glyph_067[] = { ... };
static const unsigned char glyph_065[] = {
...
};
static const unsigned char glyph_066[] = { ... };
static const unsigned char glyph_067[] = { ... };
static const unsigned char glyph_068[] = { ... };
... # then starting at line 300 say
{'A', 38, 20, glyph_065},
{'B', 38, 20, glyph_066},
{'C', 38, 20, glyph_067},
{'A', 38, 20, glyph_065},
{'B', 38, 20, glyph_066},
{'C', 38, 20, glyph_067},
{'D', 38, 20, glyph_068},
...
我想重新索引。采取上述做法:
static const unsigned char glyph_048[] = {
...
};
static const unsigned char glyph_049[] = { ... };
static const unsigned char glyph_050[] = { ... };
static const unsigned char glyph_051[] = {
...
};
static const unsigned char glyph_052[] = { ... };
static const unsigned char glyph_053[] = { ... };
static const unsigned char glyph_054[] = { ... };
static const unsigned char glyph_055[] = { ... };
... # then starting at line # 300 say.
{'0', 38, 20, glyph_048},
{'1', 38, 20, glyph_049},
{'2', 38, 20, glyph_050},
{'3', 38, 20, glyph_051},
{'4', 38, 20, glyph_052},
{'5', 38, 20, glyph_053},
{'6', 38, 20, glyph_054},
...
因此,第一个字段是glyph_
标签中数字的ascii表示。我想从一个号码开始,只是数数。字面字符只是数字的ASCII表示,因此它将在9以后计算为' 7'' 8',' 9',': ',';' ...
我的脚本知识是BASH,在BASH中这样做会很令人发指。我确定这可以作为两(2)awk
个衬垫来处理,或者至少接近它。有人能让我开始吗?
答案 0 :(得分:1)
$ awk -v s=48 '!f&&/^{/{c=0;f=1} /glyph_/{sub(/\047[^\047]+\047/,sprintf("\047%c\047",s+c)); sub(/glyph_[[:digit:]]+/,"glyph_"s+c); c++} 1' file
static const unsigned char glyph_48[] = {
...
};
static const unsigned char glyph_49[] = { ... };
static const unsigned char glyph_50[] = { ... };
static const unsigned char glyph_51[] = {
...
};
static const unsigned char glyph_52[] = { ... };
static const unsigned char glyph_53[] = { ... };
static const unsigned char glyph_54[] = { ... };
... # then starting at line 300 say
{'0', 38, 20, glyph_48},
{'1', 38, 20, glyph_49},
{'2', 38, 20, glyph_50},
{'3', 38, 20, glyph_51},
{'4', 38, 20, glyph_52},
{'5', 38, 20, glyph_53},
{'6', 38, 20, glyph_54},
...
答案 1 :(得分:0)
这可以在一行上使用静态const:
num=48
count=0
while read line; do
if [ $count -lt 300 ]; then
l=${line/static const unsigned char glyph_.*[]/static const unsigned char glyph_$num[]}
else
if [ $count -eq 300 ]; then
num=48
fi
c=$[ count - 300 ]
l=${line/[A-Z]/$c}
l=${l/glyph_*}glyph_$num},
fi
echo "$l"
num=$[ num + 1 ]
count=$[ count + 1 ]
done <textfile.txt
答案 2 :(得分:0)
像这样创建一个gawk脚本:
#!/usr/bin/gawk -f
#
BEGIN {
new=NEW_INIT;
for (old=OLD_INIT; old<OLD_MAX; old++) {
oldStr=sprintf("glyph_%03d",old);
newStr=sprintf("glyph_%03d",new);
array[oldStr]=newStr;
new++ ;
}
}
{
for (oldStr in array) {
$0 = gensub(oldStr, array[oldStr], "g", $0);
}
print $0
}
运行它发送新号码:
./script.gawk -v OLD_INIT=65 -v OLD_MAX=99 -v NEW_INIT=48 source