ทำไม `grep fil * 'จึงล้มเหลว


9

ฉันพบว่าecho file|grep fil*ล้มเหลว แต่echo abcd|grep abc*สำเร็จ

ฉันไม่เข้าใจใครจะอธิบายได้ไหม


คุณสามารถเพิ่มระบบและเวอร์ชั่นของ grep ได้หรือไม่? เนื่องจากมี gnugrep 2.16 (ภายใต้ Ubuntu 14.04 LTS) จะไม่สร้างข้อผิดพลาดใด ๆ (รหัสออก 0) และตรงกับตัวอักษรสามตัวแรก ตัวอย่างเช่นecho file|grep fil*คำตอบด้วยfile
Hastur

3
@Hastur ปัญหาเกิดจากการขยายชื่อไฟล์ก่อนนิพจน์ทั่วไป ไดเร็กทอรีการทำงานของฉันมีคำนำหน้าไฟล์โดย fil แต่ไม่ใช่ไฟล์นำหน้าด้วย abc ดังนั้น fil * จะถูกแทนที่ด้วยชื่อไฟล์ แต่ abc * ไม่เปลี่ยนแปลง
tmpbin

ขอบคุณฉันไม่ได้คิดถึงมัน เมื่อฉันพยายามของฉันฉันพยายามที่พวกเขาในไดเรกทอรีใหม่ ...
แฮสเธอร์

คำตอบ:


31

มีสองปัญหากับตัวอย่างของคุณ

หลักแรกคือคุณสมมติว่านิพจน์ทั่วไปทำงานเหมือนกับรูปแบบ globในนั้น*คือ wildcard หมายถึง "ลำดับของอักขระใด ๆ " ในการแสดงออกปกติ*หมายถึง "จำนวนของอะตอมก่อนหน้าใด ๆ" แทนดังนั้นfil*วิธีการfตามiตามศูนย์หรือมากกว่าlตัวอักษร คุณจำเป็นต้องพูดgrep fil.*เพื่อให้ได้ความหมายที่ตั้งใจไว้: .หมายถึง "ตัวละครตัวเดียวดังนั้นนั่น.*หมายถึง" ลำดับตัวอักษรใด ๆ "

ปัญหาที่น้อยกว่าคือคุณกำลังใช้อักขระพิเศษที่ไม่ได้อ้างถึงซึ่งหมายถึงบางสิ่งภายใต้กฎ glob ซึ่งหมายความว่าเชลล์สามารถตีความได้ หากคุณมีไฟล์ใด ๆ ในไดเรกทอรีท้องถิ่นตรงกับรูปแบบ glob fil*หรือabc*, เปลือกจะขยายตัวพวกเขาจึงgrepจะได้รับชื่อไฟล์ขยายเป็นรูปแบบไม่ได้ตั้งใจ RE echo file | grep 'fil.*'เมื่อใดก็ตามที่คุณใช้ตัวอักษรเช่นในบรรทัดคำสั่งที่คุณควรจะพูดกับพวกเขา:

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