วิธี grep ในซอร์สโค้ดโดยไม่ต้องแสดงความคิดเห็น


10

ฉันค้นหาวิธีการ grep ในซอร์สโค้ดโดยไม่ต้องมีบางครั้งเป็นเท็จบวกเนื่องจากความคิดเห็น เช่นถ้าฉันค้นหา foo ในรหัสที่มา. c:

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

ไร้เดียงสาgrepจะพบเหตุการณ์ 3 ครั้งที่ฉันต้องการเพียงครั้งเดียว ฉันได้เห็นวิธีนี้ใน StackOverflow แต่ไม่ได้เติมเต็มความต้องการของฉัน: PHP ไม่สามารถใช้ได้บนแพลตฟอร์ม ฉันได้พบวิธีนี้สำหรับการแสดงความคิดเห็นแบบบรรทัดเดียว แต่มันแก้ปัญหาได้เพียงบางส่วนเท่านั้น

ฉันต้องใช้เครื่องมือการเขียนสคริปต์แบบคลาสสิก (awk, sed, bash, grep และอื่น ๆ ) และฉันต้องการมันเร็วแม้ว่าจะมีไฟล์หลายพันไฟล์ก็ตาม

ตอนนี้คุณสามารถ grep ในรหัสแหล่งที่มาและวิธีการเท่านั้นและรหัสแหล่งที่มา?


3
การสร้างตารางแท็กอาจเป็นวิธีที่ดีกว่าขึ้นอยู่กับสิ่งที่คุณทำ
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบ:


10

คุณสามารถลองใช้วิธีการที่ไร้เดียงสาเพื่อจับคู่ความคิดเห็นที่ไม่ใช่เช่นนี้:

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

นี้จะตรงกับเพียงผกผันกับความคิดเห็นคำนำหน้า - ที่เป็นสายที่เริ่มต้นด้วย//, /*, *หรือ*/- และด้วยเหตุนี้มันจะไม่ออกจากบล็อกที่จะออกความเห็นด้วย/*และ*/คู่


แก้ไขเล็กน้อยเพื่อใช้สำหรับความคิดเห็นที่เยื้อง: $ egrep -v "^ [[: space:]] * ((// | / * | *))" sourcecode
mbonness

11

grep ทำงานกับข้อความล้วนและไม่ทราบอะไรเกี่ยวกับไวยากรณ์พื้นฐานของโปรแกรม C ของคุณ ดังนั้นเพื่อไม่ให้ค้นหาภายในความคิดเห็นคุณมีหลายตัวเลือก:

  1. ตัดความคิดเห็น C ก่อนการค้นหาคุณสามารถทำได้โดยใช้gcc -fpreprocessed -dD -E yourfile.cรายละเอียดโปรดดูที่/programming/2394017/remove-comments-from-cc-code

  2. เขียน / ใช้งานครึ่งสคริปต์ที่แฮ็คอย่างที่คุณได้พบแล้ว (เช่นพวกเขาทำงานโดยข้ามบรรทัดที่ขึ้นต้นด้วย//หรือ/*) เพื่อจัดการรายละเอียดของความคิดเห็น C / C ++ ที่เป็นไปได้ทั้งหมด (อีกครั้งดูลิงค์ก่อนหน้า . จากนั้นคุณยังอาจมีผลบวกที่ผิดพลาด แต่คุณไม่ต้องดำเนินการอะไรล่วงหน้า

  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

รายการถ้าไฟล์ต้นฉบับ C

ls -1 src/*.c

ถูกไพพ์ไปยัง xargs ซึ่งเรียกใช้งานตัวประมวลผลล่วงหน้าในชายด์เชลล์

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

ซึ่งต่อมาถูกไพพ์ลงในคำสั่ง grep ที่ต้องการ

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

ซึ่งจะถูกส่งไปยัง sed เพื่อคำนำหน้าแต่ละบรรทัดด้วยชื่อไฟล์ปัจจุบัน

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

ในที่สุดบรรทัดว่างที่ทำซ้ำทั้งหมดจะถูกยุบลงในบรรทัดเดียวโดยใช้ cat:

cat -s

สิ่งนี้ใช้ได้กับระบบ RHEL6 แต่ฉันคิดว่ามันเป็นระบบทั่วไปที่เพียงพอสำหรับระบบ * nix อื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.