줄 번호를 기준으로 캡슐화된 함수 이름을 찾는 방법

줄 번호를 기준으로 캡슐화된 함수 이름을 찾는 방법

로그 파일을 보고 있는데 파일 이름과 줄 번호에 오류가 있다는 메시지만 나와 있습니다. 제가 관심 있는 것은 래퍼 기능을 이해하는 것입니다. 예를 들어, 다음은 로그 파일의 내용입니다.

    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"이라는 두 가지 중요한 변수로 읽습니다. 그런 다음 ed"$file"을 호출하고 지침 목록이 포함된 here 문서를 제공합니다.

  1. "$linenum" 줄로 이동
  2. 문자열을 거꾸로 검색 "function "- 보이지 않는 공간이 있습니다
  3. q그것

출력은 ed$linenum 내용과 일치하는 줄의 두 줄입니다 "function ". 이것이 바로 우리가 모든 출력을 에 전달하는 이유입니다 sed. 여기에는 세 가지 명령이 제공됩니다.

  • 1d-- 출력의 첫 번째 줄을 삭제합니다.
  • s/function //-- 문자열 삭제"function "
  • s/(.*//-- 왼쪽 괄호부터 삭제

입력을 기반으로 한 샘플 출력은 다음과 같습니다.

For error in foo.file on line 13:
    def_442

For error in foo.file on line 25:
    ghi

입맛에 맞게 리뉴얼했습니다.

관련 정보