एंड-ऑफ-द-लाइन $ एंकर grep कमांड के साथ काम नहीं कर रहा है, भले ही फ्रंट-ऑफ-लाइन ^ एंकर है?


19

UNIX में बहुत नया है लेकिन प्रोग्रामिंग में नया नहीं है। मैकबुक पर टर्मिनल का उपयोग करना। क्रॉसवर्ड निर्माण के लिए शब्द सूचियों के प्रबंधन और खोज के प्रयोजनों के लिए, मैं ग्रेप कमांड और इसकी विविधताओं के साथ काम करने की कोशिश कर रहा हूं। बहुत सीधा लगता है, लेकिन जो मैंने सोचा था कि एक साधारण मामला होना चाहिए के साथ जल्दी लटका हुआ है।

जब मैं प्रवेश करता हूँ

grep "^COW" masternospaces.txt

मुझे वह मिलता है जो मैं चाहता हूं: गाय के साथ शुरू होने वाले सभी शब्दों की एक सूची।

लेकिन जब मैं प्रवेश करता हूं

grep "COW$" masternospaces.txt

मुझे गाय के साथ समाप्त होने वाले शब्दों की एक सूची मिलने की उम्मीद है (ऐसे कई शब्द हैं), और कुछ भी नहीं लौटाया गया है।

फ़ाइल एक सादा पाठ फ़ाइल है, जिसमें प्रत्येक पंक्ति में सभी शब्दों में केवल एक शब्द (या रिक्त स्थान के साथ एक शब्द वाक्यांश) है।

किसी भी विचार यहाँ क्या हो सकता है?


3
Masternospaces.txt फ़ाइल की उत्पत्ति क्या है? क्या यह संभव है कि इसमें यूनिक्स-शैली एलएफ के बजाय विंडोज-स्टाइल लाइन समाप्ति (सीआर-एलएफ) हो?
स्टीलड्राइवर

2
यकीन नहीं हो रहा है, लेकिन क्या आप एक सूची शब्दों या लाइनों की सूची की तलाश कर रहे हैं ... ?
19

Steeldriver-- कुछ ऐसा ही मेरा पहला विचार था। यह निश्चित नहीं था कि वहाँ क्या हो रहा है, या यहाँ तक कि संभावनाएँ क्या थीं, इसका निरीक्षण कैसे करें। मान लिया कि एक अंत वापसी एक अंत वापसी थी। वह फ़ाइल कुछ स्रोतों से एक विशाल संकलन है। मुझे भी यकीन नहीं है कि कौन सी मूल फ़ाइल मानी जाएगी। और यह पीसी और मैक दोनों मशीनों पर कम से कम तीन वर्ड प्रोसेसर के माध्यम से किया गया है। यह देखने का सबसे अच्छा तरीका क्या हो सकता है कि यह किस तरह की समाप्ति का उपयोग कर रहा है?
DTalvacchio

mikeserv-- इस .txt फ़ाइल में, हर लाइन सिर्फ एक शब्द है (या शब्दों के बीच कोई रिक्त स्थान के साथ एक वाक्यांश, इसलिए फिर से एक "शब्द")। इसलिए मैं रेखाएं खोज रहा हूं, मुझे लगता है। । । बस यह है कि प्रत्येक पंक्ति में केवल एक है जो मैं क्रॉसवर्ड उद्देश्यों के लिए एक शब्द पर विचार कर रहा हूं।
DTalvacchio

1
आप यह hexdumpजांचने के लिए उपयोग कर सकते हैं कि आपकी लाइन अंत कैसे स्वरूपित है। मेरा सुझाव है कि आप मेरे पसंदीदा प्रारूप का उपयोग करें hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt:। आउटपुट के साथ, लाइन एंडिंग्स की जाँच करें: 0a-> LF, 0d-> CR
user43791

जवाबों:


23

जैसा कि @steeldriver ने उल्लेख किया है, समस्या एक अलग पंक्ति की समाप्ति शैली के कारण होने की संभावना है जो grepअपेक्षा कर रही है।

लाइन अंत की जाँच करने के लिए

आप यह hexdumpजांचने के लिए उपयोग कर सकते हैं कि आपकी लाइन अंत कैसे स्वरूपित है। मेरा सुझाव है कि आप मेरे पसंदीदा प्रारूप का उपयोग करें:

hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt

आउटपुट के साथ, लाइन एंडिंग्स की जाँच करें: 0a-> LF, 0d-> CR। एक बहुत ही त्वरित उदाहरण कुछ इस तरह देगा:

$ hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
00000000 (0x00000000)    4e 6f 20 43 4f 57 20 65   6e 64 69 6e 67 0d 0a 45    No COW e|nding..E
00000016 (0x00000010)    6e 64 69 6e 67 20 69 6e   20 43 4f 57 0d 0a          nding in| COW..

डॉस फॉर्मेट में लाइन एंडिंग पर ध्यान दें 0d 0a:।

लाइन एंडिंग्स को बदलने के लिए

आप विभिन्न उपकरणों का उपयोग करके लाइन एंडिंग के विभिन्न तरीकों के लिए यहां या यहां देख सकते हैं , लेकिन एक बार की चीज के लिए, आप हमेशा vi / vim का उपयोग कर सकते हैं:

vim masternospaces.txt
:set fileformat=unix
:wq

बिना कुछ बदले ही टटोलना

यदि आप केवल grepपंक्ति समाप्त होने वाली किसी भी बात से मेल नहीं खाना चाहते हैं , तो आप हमेशा इस तरह लाइन अंत को निर्दिष्ट कर सकते हैं:

grep 'COW[[:cntrl:]]*$' masternospaces.txt

यदि कोई रिक्त रेखा दिखाई जाती है, तो आप यह जांच सकते हैं कि आपने वास्तव में किसी चीज़ का उपयोग करके मिलान किया -vहै cat:

grep 'COW[[:cntrl:]]*$' masternospaces.txt | cat -v

मेरा व्यक्तिगत पसंदीदा

तुम भी दोनों grep और उत्पादन का उपयोग कर मानकीकृत कर सकते हैं sed:

sed -n '/COW^M*$/{;s/^M//g;p;};' masternospaces.txt

जहां ^Mटाइप करके प्राप्त किया जाता है Ctrl-V Ctrl-M, अपने कीबोर्ड पर।

उम्मीद है की यह मदद करेगा!


यह सब बेहद मददगार है। आज समय के बाहर है, लेकिन यह सब कल के करीब से देखेंगे और देखेंगे कि क्या है। यदि इस बीच आप में से किसी के पास अपने पसंदीदा यूनिक्स कमांड संदर्भ गाइड का लिंक है, तो मैं अपने आप को थोड़ा सिखा सकता हूं कि चीजें कैसे काम कर रही हैं, मैं इसकी सराहना करता हूं। मैं यहाँ और वहाँ टुकड़े उठा रहा हूँ, लेकिन अभी तक एक स्रोत है कि मेरे जाने के स्पष्टीकरण के लिए मिल गया है। सभी को धन्यवाद और उम्मीद है कि सफल अपडेट के साथ कल की जाँच करेंगे। --D
DTalvacchio

यह बहुत बुरा है इस पोस्ट को बंद नहीं है, मेरे लिए कम से कम। मैं, मेरे जीवन के लिए, यह नहीं जान सकता कि लाइन के अंत का मिलान कैसे किया जाए। अगर मैं एक हेक्स डंप करता हूं, तो मैं आपके उदाहरण की तरह एक अच्छी लाइन को समाप्त नहीं कर सकता। मैं हेक्स के साथ काम करने से परिचित नहीं हूं इसलिए हो सकता है कि मैं इसे ठीक से नहीं पढ़ रहा हूं। मैंने [[:cntrl:]]@ user43791 का भी सुझाव दिया और यह अभी भी मेरे लिए कुछ भी मेल नहीं खा रहा है। इसका कोई अर्थ नहीं निकलता। मैं GNU grep 2.20 का उपयोग कर रहा हूं और nDPI से पार्सिंग आउटपुट जो एक टेक्स्ट फाइल को लिखा गया था
harperville

@harperville यदि आप cat -v yourfile.ext, आप क्या देखते हैं?
user43791

वैसे, रोमांचक या अप्रत्याशित कुछ भी नहीं। बस सामग्री के रूप में मैं उन्हें देखने की उम्मीद करेंगे। आप के लिए देख रहे हैं कुछ भी विशिष्ट? मैं यहां आउटपुट पेस्ट नहीं कर सकता, लेकिन मैं सिर्फ सामग्री देखता हूं। नियमित राजभाषा "" ASCII अंग्रेजी पाठ "के अनुसार file
harperville

प्रत्येक पंक्ति के अंत में @harperville कोई अतिरिक्त "^ M" नहीं है? क्या आप हेक्स की पहली कुछ पंक्तियों को चिपका सकते हैं?
user43791

1

यद्यपि आप grep के साथ 'मानक' RegEx सिंटैक्स का उपयोग कर सकते हैं (जैसा कि @ user43791 के उत्तर में ), grep में इनपुट सीमाओं को दर्शाने के लिए अन्य पहचानकर्ता भी हैं।

पूरी लाइन के शुरू और अंत के लिए \`मैचर्स (बैकटिक) (के बजाय ^) और \'(एपोस्ट्रोफी) (इसके बजाय $) हैं।

तो अपने मूल आदेश के लिए, आप उपयोग करेंगे: grep "COW\'" masternospaces.txt

साइड नोट: यह नोट करना भी महत्वपूर्ण है कि ?और +इसका शाब्दिक रूप से इलाज किया जाएगा जब तक कि आप उनका उपयोग करने से बच जाते हैं \?और \+उन्हें अपने RegEx- शैली चयनकर्ता काउंटरों को बनाने के लिए।

स्रोत: grepनियमित अभिव्यक्ति वाक्यविन्यास


grep शुरू के लिए ^ (कैरेट) ले रहा है और अंत के लिए \ '(एपोस्ट्रोपी)
GypsyCosmonaut

1

\rGrep से पहले हटाने का दूसरा तरीका :

... | dos2unix | egrep 'COW$' | ...

मुझे पसंद है कि यह बहुत स्पष्ट है क्योंकि मुझे [[:cntrl:]]लंबे समय तक चीजें याद नहीं हैं ।


-2

"$" जब grep के लिए बैर सेट सेट किया जाता है, तो इसे 'गाय' के रूप में व्याख्या की जाती है, जहां "$" को "" के रूप में माना जाता है, बेज़ेज़ $ एक एस्केप सिंबल है। जब कुछ भी $ द्वारा साथी नहीं किया गया था, तो इसे बाश शेल द्वारा खाली स्ट्रिंग के रूप में व्याख्या की जाती है, इसलिए आपको इसके बजाय grep 'COW $' masternospaces.txt का उपयोग करना चाहिए।


3
चूँकि इसका कोई वैध विस्तार नहीं है $, इसलिए इसे bash द्वारा और grep द्वारा अकेला छोड़ दिया जाएगा। खुद के लिए देखें: echo "COW$"- $अभी भी वहाँ होगा।
जेफ स्कालर

-3

BSD grep में आपको "$" से बचना होगा और अपनी स्ट्रिंग को दोहरे उद्धरण चिह्नों में बदलना होगा:

"COW\$"

1
उम नहीं। $, खोल करने के लिए विशेष नहीं होगा, क्योंकि यह बाद सामान एक वैध खोल चर नाम नहीं है। स्टैटिक स्ट्रिंग्स के आसपास सिंगल कोट्स का उपयोग करना एक बेहतर विचार है, लेकिन यहां कोई फर्क नहीं पड़ेगा।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.