我正在寻找从我拥有的源代码创建文档。我一直在环顾四周,像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
有没有办法做到这一点?
由于
答案 0 :(得分:2)
这是一个开始:
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/ {
答案 1 :(得分:0)
您可以执行文件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
获取THIS_IS_THE_STRING_I_WANT
,I_WANT_THIS_STRING_TOO
文字。
答案 2 :(得分:0)
你可以在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