ソースコードにはエラーコードが散在しています。それらを見つけることはgrepで簡単ですが、実行可能なbash関数find_code
が必要です(例:find_code ####
)。これらの行に沿って出力が提供されます。
/home/user/path/to/source.c
85 imagine this is code
86 this is more code
87 {
88 nicely indented
89 errorCode = 1111
90 that's the line that matched!
91 ok this block is ending
92 }
93 }
これが私が現在持っているものです:
find_code()
{
# "= " included to avoid matching unrelated number series
# SRCDIR is environment variable, parent dir of all of projects
FILENAME= grep -r "= ${1}" ${SRCDIR}
echo ${FILENAME}
grep -A5 -B5 -r "= ${1}" ${SRCDIR} | sed -e 's/.*\.c\[-:]//g'
}
問題:
1)これは行番号を提供しません
2).cソースファイルのみに一致します。 .c、.cs、.cpp、およびその他のソースファイルとsedを一致させるのに問題があります。ただし、Cを使用しているため、単に-または:(grepがコードの各行の前にファイル名に追加する文字)と一致するため、object->pointers
に一致し、すべてが混乱します。
私はいくつかのことを変えるでしょう。
find_code() {
# assign all arguments (not just the first ${1}) to MATCH
# so find_code can be used with multiple arguments:
# find_code errorCode
# find_code = 1111
# find_code errorCode = 1111
MATCH="$@"
# For each file that has a match in it (note I use `-l` to get just the file name
# that matches, and not the display of the matching part) I.e we get an output of:
#
# srcdir/matching_file.c
# NOT:
# srcdir/matching_file.c: errorCode = 1111
#
grep -lr "$MATCH" ${SRCDIR} | while read file
do
# echo the filename
echo ${file}
# and grep the match in that file (this time using `-h` to suppress the
# display of the filename that actually matched, and `-n` to display the
# line numbers)
grep -nh -A5 -B5 "$MATCH" "${file}"
done
}
find
を2つの-exec
sと一緒に使用できます。2つ目のものは、最初のものが成功した場合にのみ実行されます。 .cpp
、.c
、.cs
ファイルのみを検索:
find_code() {
find ${SRCDIR} -type f \
\( -name \*.cpp -o -name \*.c -o -name \*.cs \) \
-exec grep -l "= ${1}" {} \; -exec grep -n -C5 "= ${1}" {} \;
}
したがって、最初のgrep
はパターンを含むファイル名を出力し、2番目のファイルは対応する行+コンテキスト(番号付き)をそれぞれのファイルから出力します。