মন্তব্যগুলি না ধরে কীভাবে উত্স কোডটিতে গ্রেপ করা যায়


10

আমি মন্তব্যগুলির কারণে কখনও কখনও মিথ্যা-ইতিবাচক না হয়ে উত্স কোডটিতে গ্রেপ করার একটি উপায় অনুসন্ধান করি। উদাহরণস্বরূপ যদি আমি এই .c উত্স কোডটিতে foo অনুসন্ধান করি:

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

একজন নিষ্পাপ grep3 টি ঘটনা আবিষ্কার করবে যেখানে আমি কেবল একটি চাই। স্ট্যাকওভারফ্লোতে এটি করার জন্য আমি এই উপায়টি দেখেছি, তবে এটি আমার প্রয়োজনীয়তা পূরণ করে না: প্ল্যাটফর্মে পিএইচপি উপলব্ধ নেই। আমি এক লাইনের মন্তব্যের জন্যও এইভাবে খুঁজে পেয়েছি তবে এটি কেবল আমার সমস্যার একটি অংশ সমাধান করে।

আমার ক্লাসিকাল স্ক্রিপ্টিং সরঞ্জামগুলি ব্যবহার করতে হবে (awk, সেড, ব্যাশ, গ্রেপ, ইত্যাদি) এবং কয়েক হাজার ফাইল থাকা সত্ত্বেও আমার দ্রুত হওয়া দরকার ।

আপনি এখন যদি উত্স কোড এবং কেবল উত্স কোডে গ্রেপ করা কীভাবে সম্ভব?


3
একটি বিল্ডিং ট্যাগ টেবিল , একটি ভাল পদ্ধতির হতে পারে আপনি কি করছেন উপর নির্ভর করে।
গিলস

উত্তর:


10

আপনি এই জাতীয় মতামত না মেলাতে একটি নিষ্পাপ পদ্ধতির চেষ্টা করতে পারেন:

 $ egrep -v "^(//|/\*| \*)" sourcecode

পূর্বে সমাধান মন্তব্য বিরুদ্ধে এই হবে শুধুমাত্র বিপরীত ম্যাচ - যে দিয়ে শুরু লাইন পারেন //, /*, *বা */- এবং অত: পর এটা ব্লক করে দিয়ে মন্তব্য করা হয় বাদ না করব /*এবং */জোড়া।


অভিযুক্ত মন্তব্যগুলির জন্য কাজ করতে কিছুটা সংশোধন করা হয়েছে: $ egrep -v "^ [[: স্পেস:]] * ((// | / / * | *)" সোর্সকোড
মম্বনেস

11

গ্রেপ খাঁটি পাঠ্যে কাজ করে এবং আপনার সি প্রোগ্রামের অন্তর্নিহিত বাক্য গঠন সম্পর্কে কিছুই জানে না। সুতরাং, মন্তব্যের ভিতরে অনুসন্ধান না করার জন্য আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. অনুসন্ধানের আগে সি-মন্তব্যগুলি স্ট্রিপ করুন, আপনি এটি ব্যবহার করে এটি করতে পারেন gcc -fpreprocessed -dD -E yourfile.cবিশদ জন্য, দয়া করে /programming/2394017/remove-comments-from-cc-code দেখুন

  2. লিখন / কিছু হল hacky অর্ধ কাজ স্ক্রিপ্ট ব্যবহার হচ্ছে আপনি ইতিমধ্যেই পাওয়া যায় (যেমন তারা কুঁদন লাইনের শুরু করে কাজ //বা /*অর্ডার সব সম্ভব সি / সি ++ মন্তব্য বিবরণ হ্যান্ডেল করার জন্য) (আবার, কিছু ভীতিকর testcases জন্য পূর্ববর্তী লিঙ্কে দেখুন) । তারপরে আপনার কাছে এখনও মিথ্যা ধনাত্মকতা থাকতে পারে তবে আপনাকে কোনও কিছুর আগেই প্রস্রোস করতে হবে না।

  3. কোডটিতে "শব্দার্থক অনুসন্ধান" করার জন্য আরও উন্নত সরঞ্জামগুলি ব্যবহার করুন। আমি "coccigrep" পেয়েছি: http://home.regit.org/software/coccigrep/ এই ধরণের সরঞ্জামগুলি কিছু নির্দিষ্ট ভাষার বিবৃতি (যেমন প্রদত্ত নামের সাথে কোনও কাঠামোর আপডেট) সন্ধানের অনুমতি দেয় এবং অবশ্যই তারা মন্তব্যগুলি ফেলে দেয়।


1

এই প্রশ্নে দেরী-আগত আমাদের সকলের জন্য এখানে একটি নির্দিষ্ট প্রকরণ রয়েছে:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

সি উত্স ফাইল হলে একটি তালিকা

ls -1 src/*.c

xargs এ পাইপ করা হয়, যা চাইল্ড শেলের প্রিপ্রোসেসর কার্যকর করে

gcc -fpreprocessed -dD -E {} 2>&1

যা পরবর্তীতে একটি পছন্দসই গ্রেপ কমান্ডে পাইপ করা হয়

grep -wi -e one -e two -e three -n

যা বর্তমান ফাইলের নামের সাথে প্রতিটি লাইন উপসর্গ করতে সেডে পাইপ করা হয়

sed 's:^:{}\::'

অবশেষে, সমস্ত পুনরাবৃত্তি ফাঁকা লাইনগুলি বিড়ালটি ব্যবহার করে একক লাইনে পতিত হয়:

cat -s

এটি একটি RHEL6 সিস্টেমে কাজ করে তবে আমি ধরে নিই এটি অন্যান্য * নিক্স সিস্টেমের পক্ষে যথেষ্ট সাধারণ।

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