grep:ファイル名を一度表示し、行番号でコンテキストを表示します。

grep:ファイル名を一度表示し、行番号でコンテキストを表示します。

私たちのソースコードはバグのあるコードでいっぱいです。 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 
}

おすすめ記事