उस स्ट्रिंग की खोज करने के लिए grep का उपयोग करना जिसमें एक डॉट है


194

मैं 0.49कमांड का उपयोग करके एक स्ट्रिंग (डॉट के साथ) की खोज करने की कोशिश कर रहा हूं

grep -r "0.49" *

लेकिन क्या हो रहा है कि मैं भी अवांछित परिणाम प्राप्त कर रहा हूं जिसमें स्ट्रिंग जैसे 0449, 0949आदि शामिल हैं। बात किसी भी चरित्र के रूप में डॉट () पर विचार करने वाली है और सभी परिणामों को सामने ला रही है। लेकिन मैं केवल "0.49" के लिए परिणाम प्राप्त करना चाहता हूं।

जवाबों:


234

grepरेगेक्स का उपयोग करता है; .एक regex में "किसी भी चरित्र" का मतलब है। आप एक शाब्दिक स्ट्रिंग चाहते हैं, का उपयोग करें grep -F, fgrepया बचने .के लिए \.

अपने उद्धरण को डबल कोट्स में लपेटना न भूलें। वरना आपको इस्तेमाल करना चाहिए\\.

तो, आपके आदेश की आवश्यकता होगी:

grep -r "0\.49" *

या

grep -r 0\\.49 *

या

grep -Fr 0.49 *

58
काम करने के लिए मुझे दो बार भागने की जरूरत थी \\.। मैं zsh का उपयोग कर रहा हूं।
निकोस रेनीरिस

5
@NikosRenieris क्या आपने अपने ग्रेपिंग स्ट्रिंग को दोहरे उद्धरण चिह्नों से लपेटा है?
Justus Romijn

@JustusRomijn मुझे लगता है कि मैंने किया, हाँ।
निकोस रेनियरिस

15
आपको \\.बैश के लिए भी उपयोग "\."करना होगा , या शेल से बचने के लिए उपयोग करना होगा।
टोमोफूमी

36

grep -F -r '0.49' *एक नियमित अभिव्यक्ति के बजाय 0.49 को "फिक्स्ड" स्ट्रिंग मानते हैं। यह .अपना विशेष अर्थ खो देता है।


22

आप से बचने के लिए की जरूरत .के रूप में "0\.49"

.किसी भी चरित्र (न्यूलाइन को छोड़कर) से मेल करने के लिए एक रेगीक्स मेटा-चरित्र है। शाब्दिक अवधि से मेल खाने के लिए, आपको इससे बचने की जरूरत है।



5

आप भी उपयोग कर सकते हैं "[।]"

grep -r "0[.]49"

5

यहाँ बहुत से उत्तर हैं, जिसमें डॉट से बचने का सुझाव \.दिया गया है लेकिन मैं इस मुद्दे पर बार-बार भाग रहा हूँ: \.मुझे इसके समान परिणाम देता है.

हालाँकि, ये दो भाव मेरे लिए काम करते हैं:

$ grep -r 0\\.49 *

तथा:

$ grep -r 0[.]49 *

मैं Ubuntu और Archlinux पर "सामान्य" बैश शेल का उपयोग कर रहा हूं।


3
आपको शेल से रेगेक्स को उद्धृत करने या बैकस्लैश से बचने की आवश्यकता है, इसलिए शेल इसका उपभोग नहीं करता है। grep '\.'या grep \\.(मैं पूर्व में दिए गए दोहरे उद्धरण चिह्नों की जोरदार सिफारिश करूंगा। मूल प्रश्न में भी; लेकिन एकल उद्धरणों को समझना और उपयोग करना आसान है। उदाहरण के लिए, दोहरे उद्धरण चिह्नों के साथ, आपको कुछ परिदृश्यों में बैकस्लैश को दोगुना करना होगा। )।
ट्रिपल जूल

IMHO, यह सबसे सही सही उत्तर है, @tripleee की टिप्पणी के साथ यह सबसे पूर्ण है। [] का उपयोग (जो किसी एकल वर्ण से मेल खाने के लिए वर्णों के सबसेट का प्रतिनिधित्व करने का कार्य करता है) एक अच्छा हैक है।
jringoot

@jringoot गंभीरता से? मुझे लगता है कि यह बिल्कुल स्पष्ट नहीं है - यह किसी ऐसे व्यक्ति से अनुवर्ती प्रश्न की तरह दिखता है जो उद्धृत करने से परिचित नहीं था।
ट्रिपलए

यह स्पष्ट है क्योंकि दोनों अभिव्यक्तियाँ सीधे काम करती हैं और वास्तव में कई अन्य लोग यह मानते हैं कि शैल द्वारा द्वितीयक व्याख्या से बचने के लिए उद्धरण से बचने की आवश्यकता है। मैं अब टिप्पणी (5 मिनट की सीमा) नहीं बदल सकता। मेरी टिप्पणी बेहतर रही होगी: "अगर यह @tripleee की टिप्पणी के साथ संयुक्त है, तो यह सबसे पूर्ण उत्तर है। क्योंकि दोनों आदेश तुरंत काम करते हैं और उद्धरण के साथ यह पूरा हो गया है"
jringoot

1
जो मैं आमतौर पर सुझाता हूं वह है "हमेशा अपने नियमित भावों को एकल-उद्धरण"। यह "पूर्ण" नहीं है, लेकिन यह काम हो जाता है और इसका मतलब है कि आपको या तो इस सरल नियम से उद्धृत करने या रहने की आवश्यकता है।
ट्रिपल 13

4

एस्केप डॉट। सैंपल कमांड होगा।

grep '0\.00'

4

आप \ का उपयोग करके डॉट और अन्य विशेष वर्णों से बच सकते हैं

जैसे। grep -r "0 \"


भविष्य के पाठक के लिए एक अनुस्मारक, \.उद्धरण के साथ इसे काम करने के लिए आवश्यक है।
फल

1

आप उस विकल्प के साथ भी खोज सकते हैं जो मूल रूप से सभी विशेष वर्णों की उपेक्षा करता है और इसे grep द्वारा व्याख्या नहीं किया जाएगा।

$ cat foo |grep -- "0\.49"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.