Shell 使用awk解析源代码

Shell 使用awk解析源代码,shell,unix,sed,awk,gawk,Shell,Unix,Sed,Awk,Gawk,我希望从我拥有的源代码中创建文档。我一直在四处寻找,像awk这样的东西似乎会奏效,但到目前为止我还没有运气。信息分为两个文件,file1.c和file2.c 注意:我已经为程序设置了一个自动构建环境。这将检测源中的更改并构建它。我想生成一个文本文件,其中包含自上次成功构建以来已修改的所有变量的列表。我正在寻找的脚本将是一个后期构建步骤,并将在编译后运行 在file1.c中,我有一个函数调用列表(所有函数都是相同的),这些函数调用都有一个字符串名称来标识它们,例如: newFunction("TH

我希望从我拥有的源代码中创建文档。我一直在四处寻找,像awk这样的东西似乎会奏效,但到目前为止我还没有运气。信息分为两个文件,
file1.c
file2.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
有没有办法做到这一点


谢谢

您可以执行file
file2.c
,因此变量将在bash中定义。然后,只需打印
$iAlsoNeedThis
即可从
iAlsoNeedThis=25获取值

这可以通过
完成。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
读行时
;
做
名称=$(echo$行| cut-d“\”-f2);
值=$(echo$行| cut-d“&“-f2 | cut-d”)“-f1);
echo$name=${!value};
完成
要获取
THIS\u是我想要的字符串
I\u也想要这个字符串
文本。

这是一个开始:

NR==FNR{#只有在读取第一个文件时才为真
split($1,s,“\”)\从第一个字段中获取带引号的字符串
gsub(/[^a-zA-Z]/,“”,$4)#从第四个字段中删除无alpha字符
m[$4]=s[2]#创建数组
下一个
}
m{#中的$1将file1中的feild four与field one file2匹配
子(/;/,“)#摆脱;
打印m[$1],$2,$3#打印输出
}
保存此
script.awk
并使用您的示例运行它将生成:

$awk-f script.awk文件1文件2
这是我想要的字符串=25
我想要这个字符串也=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

对不起,我应该说得更清楚。我希望这个脚本运行时不必实际运行程序。它将用于及时检测源变量的变化,并将在程序生成时运行,而不是在执行时。因此,请更清楚,不要投反对票,它不会让可能的回答者高兴起来……我已经设置了一个自动程序的生成环境。这会检测源代码中的更改并进行生成。我想生成一个文本文件,其中包含自上次成功生成以来已修改的所有变量的列表。我要查找的脚本将是生成后的步骤,并在编译后运行。@fedorqui不是我否决了您的投票。我们无需使用cat。
cut…
节省了一个fork和几百万个CPU周期。当然,@Jens!事实上,只要
cut…file
就足够了。我编辑了我的答案,谢谢。你是位绅士和学者。这正是我需要的。非常感谢!我可能说得太快了。脚本打印了我需要的所有东西,但也打印了一个l还有一些不必要的信息。是否有任何方法将脚本定义为:1)仅在第三个字段为0时执行上述操作(而不是1,因为它是源代码中的其他位置)。2)仅在某个部分之间运行上述脚本。例如,如果我有一行“//start here”和“//end here”在源代码中。再次感谢。@Matthew这就是为什么我说
这里是一个开始
,因为很明显,这个示例将过于简化。请看编辑,这将有望减少输出。我现在明白了。我非常渴望看到一些工作,以至于一开始就忽略了它!我试图在e NR==FRN,然后再胡乱处理那些永远不会起作用的if语句!尽管如此,还是非常感谢您的帮助-非常感谢。感谢您的回答。不幸的是,我仅限于windows shell(目前正在使用gawk)。在“);”之后还有注释,尽管newFunction调用是行中的第一个调用,但它是缩进的(不确定这是否重要)
THIS_IS_THE_STRING_I_WANT = 25
I_WANT_THIS_STRING_TOO = 42