ทำไมผลลัพธ์ grep BSD นี้แตกต่างจาก grep GNU?


13

คอมพิวเตอร์ของฉันใช้งาน MacOS 10.12.3 และฉันใช้grepยูทิลิตี้ที่ติดตั้งระบบกับรุ่น 2.5.1-FreeBSD

เหล่านี้เป็นผลลัพธ์ที่ฉันได้รับเมื่อทดสอบ regexes ต่างๆ:

ภาพหน้าจอ

แต่ถ้าฉันเรียกใช้สิ่งเหล่านี้โดยใช้ GNU grep (รุ่น 2.25) ฉันได้รับต่อไปนี้:

ภาพหน้าจอ

grep ของ GNU ดูถูกต้องสำหรับฉันและ BSD นั้นไม่ถูกต้องใช่ไหม ทำไมพวกเขาถึงแตกต่างกัน ฉันไม่เข้าใจว่าทำไม grep ของ BSD จึงตรงกับ "a" เมื่อ regex ระบุว่าจะต้องเป็นไปตามจุดเริ่มต้นของบรรทัด


2
อย่าลังเลที่จะรายงานพฤติกรรมแรกเป็นข้อบกพร่อง
Satō Katsura

1
คุณจะเห็นว่าecho 'bababa' | grep -E '^(a|b)'เป็นสีแดงทั้งหมด -oและคุณจะมีปัญหาเดียวกันกับ ฉันเดาว่าgrepค้นหาการแข่งขันหลายรายการ แต่สำหรับการจับคู่ที่สองขึ้นไปจะใช้ regexp กับสิ่งที่อยู่ทางขวาของสิ่งที่จับคู่ในครั้งก่อน (เช่นในananaครั้งที่สองในกรณีของคุณ) โดยไม่ผ่านธง REG_NOTBOL ดูเพิ่มเติมecho banana | grep -Eo '^ban|^ana$'
Stéphane Chazelas

2
@JdeBP บน OS X ของฉันgrepระบุตัวเองเช่นเดียวgrep (BSD grep) 2.5.1-FreeBSDกับ man page ที่อ้างถึง GNU เท่านั้นโดยกล่าวถึง "ตัวเลือกแบบยาวที่มีให้เพื่อความเข้ากันได้กับเวอร์ชัน GNU" นอกจากนี้ห้ามแจ้งให้ทราบลิขสิทธิ์หรือกล่าวถึงของ GPL (หรือ FSF) ถ้ามันมีประวัติกับ GNU util มันก็ยากที่จะบอก
ilkkachu

เราแสดงให้เห็นว่าสิ่งนี้ทำให้เข้าใจผิด (-: สิ่งgrepที่ถูกกล่าวถึงในคำตอบของทศวรรษทศวรรษที่แล้วที่คนจำนวนมากกำลังคิดว่าถูกต้องระบุว่าgrep (GNU grep) 2.5.1-FreeBSD(เท่าที่เห็นในการอภิปรายข้อผิดพลาด) มีประกาศลิขสิทธิ์ FSF และแน่นอนที่สุด GNU grepสิ่งที่ FreeBSD เรียกbsdgrepคือ OpenBSD โทรgrepและเป็น BSD grepไม่มี--colorตัวเลือกที่ยื่นตัวแปร FreeBSD นั่นคือสิ่งที่ระบุว่า. grep (BSD grep) 2.5.1-FreeBSDและแดกดันคือสิ่งที่คนคนหนึ่งในการอภิปรายข้อผิดพลาดบอกว่า FreeBSD สวิทช์grepไป.
JdeBP

คำตอบ:


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