1

私が持っているソース コードからドキュメントを作成しようとしています。私は周りを見回しており、awkのようなものはうまくいくようですが、これまでのところ運がありません. 情報は 2 つのファイルに分割され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...

関数呼び出しの 4 番目のパラメーターには、文字列名の値が含まれていますfile2。例えば:

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

リストを次の形式でtxtファイルに出力しようとしています。

THIS_IS_THE_STRING_I_WANT = 25
I_WANT_THIS_STRING_TOO = 42

これを行う方法はありますか?

ありがとう

4

3 に答える 3

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/ {                    
于 2013-03-28T14:50:52.077 に答える
0

このようにシェルで実行できます。

#!/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
于 2013-03-28T14:52:40.897 に答える
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ます。

于 2013-03-28T14:36:17.733 に答える