使用awkparsing源代码

我期待从我有源代码创build文档。 我一直在四处寻找,像awk这样的东西似乎会工作,但我迄今没有运气。 信息分为两个文件file1.cfile2.c

注意 :我为该程序设置了一个自动构build环境。 这将检测源中的更改并构build它。 我想生成一个文本文件,其中包含自上次成功构build以来修改的所有variables的列表。 我正在寻找的脚本将是一个后期构build步骤,并将在编译后运行

file1.c我有一个函数调用(所有相同的函数)的列表,它们有一个string名称来标识它们,例如:

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

函数调用中的第四个参数包含file2中的string名称的值。 例如:

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

我正在寻找以下列格式输出列表到一个txt文件:

 THIS_IS_THE_STRING_I_WANT = 25 I_WANT_THIS_STRING_TOO = 42 

有没有办法做到这一点?

谢谢

这是一个开始:

 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/ { 

你可以像这样在shell中做到这一点。

 #!/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 

你可以执行file2.c文件,所以变量将在bash中定义。 然后,你将不得不打印$iAlsoNeedThisiAlsoNeedThis = 25;获得价值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文本。