私たちのソースコードはバグのあるコードでいっぱいです。 grepを使用して簡単に見つけることができますが、次のような出力を提供するfind_code
実行可能なbash関数(たとえば)が必要です。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
混乱します。
ベストアンサー1
私はいくつか変更します。
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
}