1

C ソース ファイルで定義されている各関数について、その関数が何回、どの行で呼び出されたかを調べたいと考えています。C の関数定義のように見えるパターンを検索して、その関数名が何回出現するかをカウントする必要があります。もしそうなら、どうすればいいですか?正規表現?どんな助けでも大歓迎です!

#!/bin/bash
if [ -r $1 ]; then
       #??????
else    
        echo The file \"$1\" does NOT exist
fi      

最終結果は次のとおりです: (バグがあれば報告してください)

 10 if [ -r $1 ]; then
 11         functs=`grep -n -e "\(void\|double\|char\|int\) \w*(.*)"  $1 | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
 12         for f in $functs;do
 13                 echo -n  $f\(\) is called:
 14                 grep -n $f $1 > temp.txt
 15                 echo -n `grep -c -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt`
 16                 echo " times"
 17                 echo -n on lines:
 18                 echo -n `grep  -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt | sed -n 's/^\([0-9]*\)[:].*/\1/p'`
 19                 echo
 20                 echo
 21         done    
 22 else    
 23         echo The file \"$1\" does not exist
 24 fi 
4

2 に答える 2

1

これは一種の仕事かもしれません。最初のビットは、次のような関数定義を見つけます

<datatype> <name>(<stuff>)

を引き出し<name>ます。次に、その文字列のgrepを実行します。これが機能しない状況はたくさんありますが、一部のプログラムで機能する単純なシェルスクリプトを作成しようとしている場合は、開始するのに適した場所かもしれません。

functions=`grep -e "\(void\|double\|int\) \w*(.*)$" -f input.c | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
for func in $functions
do
  echo "Counting references for $func:"
  grep "$func" -f input.c | wc -l
done
于 2012-04-08T13:23:50.647 に答える
1

この正規表現で試すことができます

(^|[^\w\d])?(functionName(\s)*\()

たとえば、すべてのprintf出現箇所を検索するには

(^|[^\w\d])?(printf(\s)*\()

この式を使用するには、次のようgrepにオプションを使用する必要があります-E

grep -E "(^|[^\w\d])?(printf(\s)*\()" the_file.txt

最後の注意点として、このソリューションの欠点は、コメント ブロック内の出現をスキップすることです。

于 2012-04-08T13:32:31.587 に答える