grep พฤติกรรมแปลก ๆ ด้วยคำตัวอักษรเดียว


10

ฉันลบคำหยุดออกจากข้อความโดยใช้รหัสนี้ประมาณ

ฉันมีดังต่อไปนี้

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

ฉันคาดหวังผลลัพธ์: extensions

แต่ฉันได้รับ (ฉันคิดว่าไม่ถูกต้อง)

file
extensions

เหมือนกับว่าคำfileนั้นถูกข้ามในไฟล์ stopwords ตอนนี้ที่นี่บิตเย็น: ถ้าผมปรับเปลี่ยนแฟ้มคำหยุดโดยการเปลี่ยนเดียวคำ / ตัวอักษรiในบรรทัดแรกเพื่อพยัญชนะอื่น ๆ นอกเหนือจากf, i, l, eแล้วคำสั่ง grep extensionsเดียวกันทำให้ผมมีผลแตกต่างกันและถูกต้องของ

เกิดอะไรขึ้นที่นี่และฉันจะแก้ไขได้อย่างไร

ฉันกำลังใช้ grep (BSD grep) 2.5.1-FreeBSD บนเครื่อง Mac OSX GNU bash รุ่น 4.4.12 (1)


คุณอาจต้องการใช้-xสวิตช์สำหรับ line regex แทนที่จะ-wเป็น word? อย่างไรก็ตามฉันคิดว่า-Fสวิตช์จะยกเลิกอย่างใดอย่างหนึ่งหรือสลับกัน
jesse_b

grep (GNU grep) 3.1 ทำงานได้ตามที่คุณคาดหวัง
Hauke ​​Laging

ฉันทำซ้ำสิ่งนี้ Another datum: การทำให้iรูปแบบเป็นที่สองแทนที่จะเป็นรูปแบบแรกในstopwordsไฟล์ก็จะเปลี่ยนลักษณะการทำงาน
JdeBP

ฉันไม่สามารถทำซ้ำพฤติกรรมใน OpenBSD 6.2 กับ native grepหรือกับ GNU grep3.1
Kusalananda

คำตอบ:


13

นี่เป็นข้อผิดพลาดที่bsdgrepเกี่ยวข้องกับตัวแปรที่ติดตามส่วนของบรรทัดปัจจุบันที่ยังสแกนซึ่งเขียนทับด้วยการเรียกไปยังเอ็นจินการจับคู่นิพจน์ทั่วไปเมื่อต่อเนื่องหลายรูปแบบ

การแก้ไขท้องถิ่น

คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยไม่ใช้-wตัวเลือกซึ่งอาศัยตัวแปรนี้สำหรับการดำเนินการที่ถูกต้องและล้มเหลว แต่แทนที่จะใช้ส่วนขยายนิพจน์ทั่วไปที่ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของคำทำให้stopwordsไฟล์ของคุณมีลักษณะดังนี้:

\ <i \>
\ <ไฟล์ \>
\ <ประเภท \>

วิธีแก้ปัญหานี้จะต้องให้คุณไม่ใช้-Fตัวเลือก

โปรดทราบว่าเอกสารส่วนประกอบแสดงออกปกติ[[:<:]]และ[[:>:]]ว่าre_formatคู่มือบอกคุณเกี่ยวกับจะไม่ได้ทำงานที่นี่ นี่เป็นเพราะไลบรารีนิพจน์ทั่วไปที่คอมไพล์แล้วbsdgrepมีการเปิดใช้งานการรองรับความเข้ากันได้ของนิพจน์ปกติของ GNU นี่เป็นข้อผิดพลาดอื่นซึ่งได้รับการแก้ไขตามที่รายงานไว้

แก้ไขบริการ

ข้อผิดพลาดนี้ได้รับการแก้ไขเมื่อต้นปี การแก้ไขยังไม่ได้ทำให้เป็นรสชาติที่มั่นคงหรือปล่อยของ FreeBSD แต่มีรายงานว่าในปัจจุบัน

สำหรับการรับในรุ่น MacOS grepที่มาจาก FreeBSD bsdgrepโปรดปรึกษา Apple ☺

อ่านเพิ่มเติม


ดีและขอบคุณสำหรับการรายงานต้นน้ำนี้ ฉันจะพบคำตอบที่น่าสนใจยิ่งขึ้นถ้ามันอ้างถึงรหัสรถ
dhag

1

รหัสนี้:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

ผลิต:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

ในระบบเช่น:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

รายละเอียดเพิ่มเติมเกี่ยวกับ cgrep มีให้บริการผ่านทาง Brew และจาก sourceforge:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

ไชโย


เพิ่งได้ grep ใหม่
ทิม

@Tim - ฉันหวังว่าคุณจะพบว่า cgrep มีประโยชน์เท่าที่ฉันมี ความเร็วในการทดสอบที่ฉันทำไว้นั้นค่อนข้างจะเทียบเท่ากับ GNU grep และคุณสมบัติ "บริบท / หน้าต่าง" นั้นมีประโยชน์มาก นอกจากนี้ยังสร้างได้อย่างง่ายดายบนระบบ Linux ... ไชโย, drl
drl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.