नए सिरे से अनदेखी करने वाली फ़ाइल में पाठ की खोज कैसे करें?


11

मैं उस पाठ की खोज करना चाहूंगा जो किसी फ़ाइल में कई पंक्तियों में विभाजित हो सकता है। एक grep जो लाइन ब्रेक को अनदेखा करेगा और लाइनों के मिलान अवधि को वापस करेगा।

उदाहरण के लिए is an example file, मैं इसे खोज रहा हूं , और उम्मीद करता हूं कि यह निम्नलिखित फाइल में मिलेगा :

यह
एक
उदाहरण फ़ाइल है।

अग्रणी या अनुगामी रिक्त स्थान पर निर्भर नहीं करने के लिए, पूरी तरह से सफेद स्थान के सभी रूपों की अनदेखी करना सबसे अच्छा हो सकता है (आदर्श रूप से, एक ही स्थान के रूप में सफेद स्थान के किसी भी क्रम का इलाज)।


एक गैर-आदर्श समाधान है tr '\n' ' ' | grep, जो मैचों और गैर-मैचों के बीच भेदभाव करता है, लेकिन मैच नहीं दिखाता है, और न ही बड़ी फ़ाइलों के साथ अच्छा व्यवहार करता है।


SO पर (कोई निश्चित उत्तर नहीं): stackoverflow.com/q/1858312/1449460
निकाना रेक्लाविक्स

एक साइड नोट के रूप में, isearch-forward
एमएसीएस

तो विम का है /This\_sis:। अधिक जानकारी के लिए: :help \_s
lcd047

अपनी खोज लाइन के अंत में इस पंक्ति को जोड़ें: tr -n "\ n" यह सभी नई लाइनें हटा देगा। उममीद है कि इससे मदद मिलेगी!
डैन हॉवेल

जवाबों:


12

जीएनयू grepकर सकता है

grep -z 'is\san\sexample\sfile.' file

कुछ बिंदुओं को पूरा करने के लिए जो स्क्रिप्ट में कुछ संशोधन करते हैं:

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

विशाल फ़ाइलों के बारे में मुझे स्मृति सीमा की कोई कल्पना नहीं है लेकिन समस्या के मामले में आप उपयोग करने के लिए स्वतंत्र हैं sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

कि स्मृति में 4 लाइनों (क्योंकि पैटर्न में 4 शब्द) से अधिक नहीं रखें \(\n.*\)\{3\}


5
जैसा कि मुझे यकीन है कि आप जानते हैं, -zविकल्प grepनई वर्णमाला को साधारण पाठ पात्रों के रूप में मानता है, और अलग-अलग रिकॉर्ड के लिए न्यूल बाइट्स की तलाश करता है। एक पाठ फ़ाइल में कोई न्यूल बाइट्स (यानी, विशिष्ट मामला) के साथ, grep -zपूरी फ़ाइल को एक पंक्ति के रूप में माना जाएगा। तो (1) यह इस सवाल को उठाता है कि यह बड़ी फ़ाइलों को कितनी अच्छी तरह से संभाल सकता है, और (2) यदि यह एक मैच पाता है, तो यह पूरी फाइल को लिख देगा, जिससे मैच का स्थान पता नहीं चलेगा। इसके अलावा (3) ओपी ने कहा, "आदर्श रूप से, सफेद अंतरिक्ष के किसी भी अनुक्रम को एक ही स्थान के रूप में मानते हुए," इसलिए आपको उपयोग \s+और जोड़ना चाहिए -E
जी-मैन कहते हैं, 'रिइनेटेट मोनिका'

1
@ जी-मैन टिप्पणी के लिए धन्यवाद। कृपया संपादित उत्तर देखें।
कोस्टास

1
(०) अह -o; मैं उसके बारे में भूलता रहता हूं। इसका इस्तेमाल करने का चतुर तरीका। (१) आपका नया grepउत्तर शुरू होता है ^[\n]*; इसके लिए एक टाइपो है [^\n]*। (२) मैंने \s+जानबूझ कर कहा ।  be\s*littleमैच होगा belittle, और care\s*lessमैच होगा careless। लेकिन मुझे लगता है कि यह एक मामूली समस्या है। और, यदि आप उपयोग नहीं करना चाहते हैं -E, तो आप "गरीब आदमी के संस्करण" का उपयोग कर सकते हैं \s+, अर्थात् \s\s*। (३) अच्छी sedआज्ञा। यदि रिक्त रेखाएँ हैं, तो यह विफल हो सकता है (इसलिए चार-शब्द वाक्यांश चार से अधिक लाइनों में फैल सकता है); मैं जोड़कर ठीक करने में सक्षम था s/\n\s*\n/\n/
जी-मैन 'को फिर से बहाल मोनिका' कहते

@ जी-मैन थैंक यू एगिंग। आपकी टिप्पणियाँ बहुत उपयोगी हैं। मेरे पास अधिक या कम पोर्टेबल कोड पोस्ट करने की कोशिश है क्योंकि प्रसिद्ध सदस्य हर बार मुझे ऐसा करने के लिए धक्का देते हैं। वैसे भी बिना -Eस्टील के आप फॉर्म +में उपयोग करने में सक्षम हैं \s\+। पैटर्न के अंदर खाली लाइनें एक विरोधाभास लगती हैं।
कोस्टास

मैं RFC की तरह पृष्ठांकित पाठ दस्तावेज़ों के बारे में सोच रहा था - ISTR कि मैन पेज कुछ सिस्टम (या किया ) पर उस तरह दिखते हैं - लेकिन, आगे के विचार पर, यह मेरे लिए होता है कि इस तरह के अधिकांश दस्तावेज़ों में पेज हेडर (और) और / या पाद लेख हैं। (ओं) कि आप grepवाक्यांशों के लिए उन्हें उम्मीद कर सकता से पहले छीन लिया जाना चाहिए ।
जी-मैन का कहना है कि 'मोनिका'

7

इसे इस्तेमाल करे:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT

\sअगर मुझे "यह बहुत लंबा पैटर्न है" तो क्या मुझे 5 बार टाइप करना है ?
निकाना रेक्लाविक्स

1
हां: बिंदु \sमिलान स्थान है, और न्यूलाइन एक "स्पेस" है।
lcd047

मेरा मतलब है, अगर फ़ाइल है This\nis a very\nlong pattern, और मुझे नहीं पता कि लाइन ब्रेक कहाँ हो सकता है। मुझे खोजना होगा This\sis\sa\svery\slong\spattern, है ना? (जो पैटर्न की लंबाई बढ़ने या कहीं और से चिपकाने के कारण थकाऊ हो जाता है)
निकाना रेक्लाविक्स

2
तब आप इसे इस तरह से करते हैं pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file:।
lcd047
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.