ログファイルを表示していますが、ファイル名と行番号にエラーがあるというメッセージだけが表示されます。私が興味を持っているのは、ラッパーの機能を理解することです。たとえば、以下はログファイルの内容です。
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ドキュメントを提供します。
- 「$linenum」行に移動
- 文字列を逆に検索
"function "
- 見えないスペースがあります 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
口当たりに合わせてリニューアルしました。