গ্রেপ: একবার ফাইলের নাম প্রদর্শন করুন, তারপরে লাইন সংখ্যার সাথে প্রসঙ্গটি প্রদর্শন করুন


16

আমাদের উত্স কোডটিতে ত্রুটিযুক্ত কোডগুলি ছড়িয়ে আছে। গ্রেপ দিয়ে তাদের সন্ধান করা সহজ, তবে আমি একটি বাশ ফাংশন চাই 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, এবং অন্যান্য উত্স ফাইলগুলি মিলিয়ে নিতে আমার সমস্যা হচ্ছে। আমরা সি ব্যবহার করি, তবে সহজভাবে মিলে যায় - বা: (প্রতিটি অক্ষরের কোডের আগে গ্রেপ করা ফাইলগুলি নামের সাথে মিলিয়ে যায়) object->pointersএবং সবকিছু মিলে যায়।

উত্তর:


11

আমি কিছু জিনিস পরিবর্তন করতে হবে।

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 
}

আমি এটিকে আমার স্পেসিফিকেশনের সাথে সামঞ্জস্য করেছি - আমি কেবল ত্রুটি কোডগুলি সন্ধান করতে চাই। তাই MATCH="= ${1}"--include=*.c --include=*.cpp --include=*.java --include=*.csউত্স ফাইলগুলিতে অনুসন্ধান সীমাবদ্ধ করতে আমি যুক্তও করেছি। ধন্যবাদ!
ট্র্যাভিস থমাস 21

1
ভাল ওহ, আপনি আপনার প্রয়োজনের সাথে এটি সূক্ষ্মভাবে পরিচালনা করতে পেরে আনন্দিত :)
ড্রভ স্লোয়ান

3

আপনি ব্যবহার করতে পারে findদুটো -execএস, দ্বিতীয় এক মৃত্যুদন্ড কার্যকর করা হবে শুধুমাত্র যদি প্রথম এক শুধুমাত্র অনুসন্ধানের সফল হয়, যেমন .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আপনার প্যাটার্নযুক্ত ফাইলের নামগুলি মুদ্রণ করে এবং দ্বিতীয়টি সম্পর্কিত ফাইলগুলি থেকে মিলযুক্ত লাইন + প্রসঙ্গ, নম্বরযুক্ত, মুদ্রণ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.