如何在标签中使用ascii数字数据重新索引文本文件?

时间:2014-09-30 15:41:39

标签: bash awk scripting

我正在重构代码,并且已经在我的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个衬垫来处理,或者至少接近它。有人能让我开始吗?

3 个答案:

答案 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