ฉันทำอะไรผิดกับ grep


1

ดังต่อไปนี้สมเหตุสมผล (แม้ว่าคุณจะไม่เห็นเนื้อหาของ debug.cpp)

$ grep '^[A-Za-z_]' debug.cpp
float CheckExistence();
entity Findgoal(float gno);
void RPrint(const string& msg);
void MakeMeDebug(entity who);
void dremove(entity te)
void display_location()
void RPrint(const string& msg)
void MakeMeDebug(entity who)

ตอนนี้เมื่อฉันเพิ่ม .*ดังนี้

$ grep '^[A-Za-z_].*' debug.cpp

ฉันได้รับ 8 บรรทัดว่างเปล่าเป็นผลลัพธ์ (ซึ่งฉันไม่สามารถทำให้เว็บไซต์นี้แสดงผลได้) ฉันสงสัยว่าเป็นข้อผิดพลาดอย่างยิ่งฉันได้อัปเดต grep ล่าสุด (เวอร์ชั่น 2.25) แล้วและก็ทำสิ่งเดียวกัน ฉันใช้ Ubuntu

หากความเข้าใจของฉันถูกต้องนิพจน์ปกติของฉันจะพูดว่า: "จับคู่บรรทัดที่ขึ้นต้นด้วยตัวอักษร A ถึง Z, แบบตัวพิมพ์เล็กหรือตัวพิมพ์เล็ก, หรือขีดล่างตามด้วยอะไรก็ได้

นี่เป็นข้อบกพร่องหรือไม่? หรือฉันกำลังทำอะไรผิดพลาด?


คุณเคยลองไหม grep -e '...' ?
Eugen Rieck

ใช่. ฉันได้ลองใช้ -E และ -P แล้ว แต่ฉันสูญเสียฟังก์ชัน grep Perl เมื่อฉันติดตั้ง grep 2.25 ด้วยโชคไม่ดี
Pulseczar

ลองใส่คำศัพท์ของคุณใน parens หรือเพิ่มความยาว {1} สำหรับคำแรกของคุณ ดูเหมือนว่าจะทำหน้าที่เป็นหรือกับคำที่สองของคุณ
Frank Thomas

1
จะเกิดอะไรขึ้นถ้าคุณส่งผลให้ผ่าน cat หรือ cat -v?
grawity

เมื่อส่งเข้าไปในแมวมันจะแสดงทั้ง 8 บรรทัดอย่างถูกต้อง มีความคิดใดบ้างที่ไม่แสดงเส้นเมื่อไม่ได้ใส่แมว
Pulseczar

คำตอบ:


3

cpp ของคุณอยู่ในรูปแบบ DOS ที่มีการยกเลิกบรรทัดโดยลำดับ \ r \ n และคุณมีนามแฝง 'grep --color = auto' ที่มีอยู่สำหรับ grep ในเซสชันของคุณในเวลาเดียวกัน นามแฝงนี้ทำให้เทอร์มินัลควบคุมลำดับ escape รอบ ๆ สตริงที่ตรงกับ หากสตริงนั้นเป็นตัวอักษรคำนั้นจะไม่รบกวนผลลัพธ์บนเทอร์มินัล อย่างไรก็ตามหากสตริงมีอักขระขึ้นบรรทัดใหม่ (\ r ซึ่งจับคู่กับอักขระตัวสุดท้ายของ. *) ดูเหมือนว่าจะทำให้เกิดผลข้างเคียงนี้เมื่อถูกล้อมรอบด้วยลำดับ

เมื่อเรียกใช้ --color = auto grep จะรับรู้เมื่อเอาต์พุตถูกส่งไปยังไพพ์และจากนั้นจะไม่ทำการแยกสตริงดังนั้นจึงหลีกเลี่ยงผลข้างเคียงและปรากฏขึ้น

หลังจาก grep ที่ไม่ละลายแล้วปรากฏการณ์จะหายไป

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


1
ขอบคุณมาก. ปัญหานี้ทำให้สมองของฉันแน่น ดูเหมือนว่าจะแก้ไขปัญหาทุกชนิดที่ฉันมีกับ grep และนิพจน์ทั่วไป มันจะไม่ให้ฉันโหวตคุณเพราะชื่อเสียงของฉันต่ำเกินไป
Pulseczar

1
ไม่มีปัญหาเลย. มันเป็นความท้าทายที่สนุก
Gombai Sándor

1
ครั้งต่อไปที่คุณสามารถปิดใช้งานนามแฝงในหนึ่งบรรทัดโดยใช้ \ grep แทน grep ดังนั้นคุณจะมี \ grep '^ [A-Aa-z_]' debug.cpp
DDay

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