行番号に基づいてカプセル化された関数名を見つける方法

行番号に基づいてカプセル化された関数名を見つける方法

ログファイルを表示していますが、ファイル名と行番号にエラーがあるというメッセージだけが表示されます。私が興味を持っているのは、ラッパーの機能を理解することです。たとえば、以下はログファイルの内容です。

    Error: foo.file on line wxy
    Error: foo.file on line xyz
    .
    .
    .

foo.file ファイルの内容です。

function abc_1234 (...)
    .
    .
    .


    endfunction

    function def_442 ()
    .
    .
    .
   //Following line number is  WXY
    assign Z ==== X;

    endfunction


    function ghi(...)
    .
    .
    .


  //Following line number is  XYZ
    assign X = X;
    endfunction

   .
   .
   .

def_442上記のログファイルに基づいて関数名を取得してghi返したいです。私は次を試しました

# look for function definitions and record the function name
# in the func_name variable
/function [[:alpha:]][[:alnum:]]*[[:blank:]]*([^)]*)/ {
  func_name = substr($2, 1, index($2, "(")-1);
}

# when we reach the target line number, print out the current
# value of func_name
NR == target {
  print func_name
}

しかし、以前は席があってabc_1234 (...)失敗しました。def_442 (...)(

答え1

ソースコードを正しく解析できないため、一致しない可能性があるコメントや文字列で気にする必要はありません。以下のスクリプトは、単に指定されたファイルの与えられた行番号から逆方向に文字列を検索します"function "(引用符で囲まれています)。見ることができます):

#!/bin/sh
while read -r error file on line linenum
do
  : "SC2034: $error, $on, and $line are unused"
  printf 'For error in %s on line %d:\n' "$file" "$linenum"
  ed -s "$file" << EOF | sed '1d; s/function //; s/(.*//'
  $linenum
  ?function 
  q
EOF
  echo
done < logfile

外部whileループは、これをlogfile「$file」と「$linenum」という2つの重要な変数として読み込みます。その後、ed「$ file」を呼び出し、指示のリストを含むhereドキュメントを提供します。

  1. 「$linenum」行に移動
  2. 文字列を逆に検索"function "- 見えないスペースがあります
  3. qそれ

出力は、ed$linenumの内容と一致する行の2行です"function "。これが私たちがすべての出力をに渡す理由ですsed。これには3つのコマンドがあります。

  • 1d- 出力の最初の行を削除します。
  • s/function //- 文字列の削除"function "
  • s/(.*//- 左括弧から削除

入力に基づくサンプル出力は次のとおりです。

For error in foo.file on line 13:
    def_442

For error in foo.file on line 25:
    ghi

口当たりに合わせてリニューアルしました。

関連情報