एकल अक्षर शब्दों के साथ अजीब व्यवहार


10

मैं इस कोड का उपयोग करते हुए एक पाठ से रोक शब्दों को हटा रहा हूं

मेरे पास निम्नलिखित है

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

मैं परिणाम की उम्मीद कर रहा हूँ: extensions

लेकिन मुझे लगता है (मुझे लगता है कि गलत है)

file
extensions

यह ऐसा है जैसे शब्द fileस्टॉपवार्ड फ़ाइल में छोड़ दिया गया है। अब यहाँ शांत सा है: अगर मैं stopwords फ़ाइल को संशोधित, एक शब्द / पत्र बदलकर i, पहली पंक्ति पर अलग से किसी भी अन्य ascii अक्षर के लिए f, i, l, e, तो एक ही ग्रेप आदेश मुझे का एक अलग और सही परिणाम देता है extensions

यहां क्या चल रहा है और मैं इसे कैसे ठीक करूं?

मैं grep (BSD grep) 2.5.1-FreeBSD का उपयोग मैक OSX GNU बैश पर कर रहा हूँ, संस्करण 4.4.12 (1)


आप शब्द के -xबजाय लाइन रेगेक्स के लिए स्विच का उपयोग करना चाह सकते हैं -w? हालाँकि मुझे लगता है कि -Fस्विच उनमें से किसी को भी रद्द कर देगा, या इसके विपरीत।
jesse_b

grep (GNU grep) 3.1 आपकी अपेक्षा के अनुसार काम करता है।
हाऊक लैजिंग

मैंने इसे दोहराया है। एक और डेटा: फ़ाइल iमें पहले पैटर्न के बजाय पैटर्न को दूसरा बनाना stopwordsभी व्यवहार को बदल देता है।
JdeBP

मैं OpenBSD 6.2 पर देशी grepऔर न ही GNU grep3.1 के साथ व्यवहार को पुन: पेश नहीं कर सकता ।
Kusalananda

जवाबों:


13

यह एक बग था bsdgrep, जिसमें एक वैरिएबल से संबंधित था , जो वर्तमान लाइन के उस हिस्से को स्कैन करने के लिए अभी भी स्कैन करता है जो कई पैटर्न शामिल होने पर नियमित अभिव्यक्ति मिलान इंजन के लिए लगातार कॉल के साथ ओवरराइट किया जाता है।

स्थानीय सुधार

आप -wविकल्प का उपयोग न करके इसके चारों ओर एक हद तक काम कर सकते हैं , जो सही संचालन के लिए इस चर पर निर्भर है और इस प्रकार विफल हो रहा है, लेकिन इसके बजाय शब्दों की शुरुआत और अंत से मेल खाने वाले नियमित अभिव्यक्ति एक्सटेंशन का उपयोग करते हुए, आपकी stopwordsफ़ाइल की तरह दिखते हैं:

\ <I \>
\ <फ़ाइल \>
\ <प्रकार \>

इस वर्कअराउंड के लिए यह भी आवश्यक होगा कि आप -Fविकल्प का उपयोग न करें ।

ध्यान दें कि प्रलेखित नियमित अभिव्यक्ति घटक [[:<:]]और मैनुअल आपको इस बारे में बताता है [[:>:]]कि यहां काम नहींre_format करेगा । इसका कारण यह है कि नियमित अभिव्यक्ति लाइब्रेरी को जीएनयू नियमित अभिव्यक्ति संगतता समर्थन में संकलित किया गया है। यह एक और बग है, जो कथित तौर पर तय किया गया है।bsdgrep

सर्विस फिक्स

यह बग इस साल की शुरुआत में तय किया गया था। फिक्स ने अभी तक इसे FreeBSD के STABLE या RELEASE फ्लेवर में नहीं बनाया है, लेकिन कथित तौर पर CURRENT में है।

के इस MacOS संस्करण में grepप्राप्त करने के लिए , जो FreeBSD से प्राप्त होता है bsdgrep, कृपया Apple से परामर्श करें। ☺

आगे की पढाई


अच्छा है, और इस अपस्ट्रीम को रिपोर्ट करने के लिए धन्यवाद। मुझे यह उत्तर और भी अधिक आकर्षक लगेगा यदि यह छोटी गाड़ी कोड को उद्धृत करता है।
17

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 पर अधिक विवरण, काढ़ा के माध्यम से उपलब्ध, और स्रोत से:

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 मिला।
टिम

@ टिम - मुझे आशा है कि आपके पास मेरे अनुसार cgrep उतना ही उपयोगी होगा। मैंने जो परीक्षण किए हैं उनकी गति ने इसे GNU grep के बराबर रखा है, और "संदर्भ / विंडोिंग" सुविधाएँ बहुत उपयोगी हैं। यह लिनक्स सिस्टम पर भी आसानी से बनाता है ... चीयर्स, डीआरएल
डीआरएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.