用awk解析源代码(Use awk to parse source code)

2019-10-17 21:56发布

我期待从源代码创建的文档,我有。 我一直环顾四周,像AWK好像它会工作,但到目前为止,我已经没有运气。 该信息在两个文件中,拆分file1.cfile2.c

:我已经设置了程序自动生成环境。 该检测源的变化,并建立它。 我想生成包含自上次成功构建已修改的任何变量列表的文本文件。 我在寻找剧本将是一个生成后步骤,以及编译后运行会

file1.c我有一个函数调用(所有相同的函数)具有一个字符串名称来识别它们,如清单:

newFunction("THIS_IS_THE_STRING_I_WANT", otherVariables, 0, &iAlsoNeedThis);
newFunction("I_WANT_THIS_STRING_TOO", otherVariable, 0, &iAnotherOneINeed);
etc...

在函数调用中的第四个参数中包含字符串名称的价值file2 。 例如:

iAlsoNeedThis = 25;
iAnotherOneINeed = 42;
etc...

我期待输出列表以下列格式的TXT文件:

THIS_IS_THE_STRING_I_WANT = 25
I_WANT_THIS_STRING_TOO = 42

有没有做这个办法吗?

谢谢

Answer 1:

这里是一个开始:

NR==FNR {                     # Only true when we are reading the first file
    split($1,s,"\"")          # Get the string in quotes from the first field
    gsub(/[^a-zA-Z]/,"",$4)   # Remove the none alpha chars from the forth field
    m[$4]=s[2]                # Create array 
    next
}
$1 in m {                     # Match feild four from file1 with field one file2
    sub(/;/,"")               # Get rid of the ;
    print m[$1],$2,$3         # Print output
}

保存该script.awk并与你的榜样产生运行它:

$ awk -f script.awk file1 file2
THIS_IS_THE_STRING_I_WANT = 25
I_WANT_THIS_STRING_TOO = 42

编辑:

您需要修改影响脚本的第一行:

NR==FNR && $3=="0," && /start here/,/end here/ {                    


Answer 2:

你可以做到这一点的壳像这样。

#!/bin/sh

eval $(sed 's/[^a-zA-Z0-9=]//g' file2)

while read -r line; do
  case $line in
    (newFunction*)
      set -- $line
      string=${1#*\"}
      string=${string%%\"*}
      while test $# -gt 1; do shift; done
      x=${1#&}
      x=${x%);}
      eval x=\$$x
      printf '%s = %s\n' $string $x
   esac
done < file1.c

假设:newFunction是在该行的开始。 没有遵循); 。 空白完全按照您的样品英寸 产量

THIS_IS_THE_STRING_I_WANT = 25
I_WANT_THIS_STRING_TOO = 42


Answer 3:

您可以执行文件file2.c这样的变量将在bash进行定义。 然后,你就只需要打印$iAlsoNeedThis从中获取价值iAlsoNeedThis = 25;

这是可以做到的. file2.c . file2.c

然后,你可以做的是:

while read line;
do
    name=$(echo $line | cut -d"\"" -f2);
    value=$(echo $line | cut -d"&" -f2 | cut -d")" -f1);
    echo $name = ${!value};
done < file1.c

拿到THIS_IS_THE_STRING_I_WANTI_WANT_THIS_STRING_TOO文本。



文章来源: Use awk to parse source code