2009-12-13 14 views
6

वास्तव में यहां मूल प्रश्न है। तो मुझे एक डॉट बताया गया है। लाइन ब्रेक से बाहर किसी भी चरित्र से मेल खाता है। मैं कुछ ऐसा ढूंढ रहा हूं जो लाइन ब्रेक समेत किसी भी चरित्र से मेल खाता हो।क्या Grep में वास्तव में सार्वभौमिक वाइल्डकार्ड है?

मैं बस इतना करना चाहता हूं कि वेबसाइट के सभी टेक्स्ट को दो विशिष्ट तारों के बीच, शीर्षलेख और पाद लेख को अलग करना है। हेडर टेक्स्ट (। +) फ़ोटर टेक्स्ट की तरह कुछ और फिर कोष्ठक में क्या निकालें, लेकिन मुझे हेडर और फ़ूटर के बीच सभी टेक्स्ट और लाइन ब्रेक को शामिल करने का कोई तरीका नहीं मिल रहा है, क्या यह समझ में आता है? अग्रिम में धन्यवाद!

उत्तर

7

जब मैं लाइन विच्छेद सहित कई पात्रों, मैच के लिए की जरूरत है, मुझे क्या करना:

[\s\S]*? 

नोट मैं एक गैर लालची पैटर्न

+2

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

3

आप पर्ल के साथ यह कर सकता है:

$ perl -ne 'print if /HEADER TEXT/ .. /FOOTER TEXT/' file.html 

सीमांकक के बीच केवल पाठ मुद्रित करने के लिए उपयोग करें

$ perl -000 -lne 'print $1 while /HEADER TEXT(.+?)FOOTER TEXT/sg' file.html 

/s स्विच नियमित अभिव्यक्ति मिलान एक के रूप में पूरी स्ट्रिंग का इलाज करता है s इंजेल लाइन, जिसका अर्थ है डॉट न्यूलाइन से मेल खाता है, और /g का अर्थ है जितनी बार संभव हो सके मैच।

उपर्युक्त उदाहरण मानते हैं कि आप स्थानीय डिस्क पर HTML फ़ाइलों पर क्रैंकिंग कर रहे हैं। आप उन्हें पहली लाने के लिए की जरूरत है, LWP::Simple से get का उपयोग करें:

$ perl -MLWP::Simple -le '$_ = get "http://stackoverflow.com"; 
          print $1 while m!<head>(.+?)</head>!sg' 

नियमित अभिव्यक्ति के साथ कृपया ध्यान दें कि पार्स एचटीएमएल ऊपर के रूप में सामान्य स्थिति में काम नहीं करता! यदि आप त्वरित और गंदे स्कैनर पर काम कर रहे हैं, तो ठीक है, लेकिन एक ऐसे अनुप्रयोग के लिए जो अधिक मजबूत होने की आवश्यकता है, असली पार्सर का उपयोग करें।

1

जैसा कि कहीं और बताया गया है, grep एकल पंक्ति सामग्री के लिए काम करेगा।

कई लाइनों के लिए (Regexp :: MULTILINE साथ गहरे लाल रंग का, या अजगर में, awk, SED, जो कुछ भी), "\ s" भी पंक्ति विराम पर कब्जा करना चाहिए, ताकि

HEADER TEXT(.*\s*)FOOTER TEXT 

काम कर सकते हैं .. ।

+0

आपको उस मोड में फ़ाइल को पढ़ना होगा जो काम करने के लिए स्मृति में कई पंक्तियों को स्कैन करता है। –

+0

धन्यवाद, मैंने जोड़ा कि आप रूबी में ऐसा कैसे करेंगे। आईआईआरसी, वह/जी में है, है ना? – phtrivier

2

grep मैन ऑफ द पेज का कहना है:

ग्रेप, egrep, fgrep, rgrep - एक पैटर्न मिलान प्रिंट लाइनों

grep एक लाइन से अधिक मिलान करने के लिए नहीं बनाया गया है। आपको perl या awk के साथ इस कार्य को हल करने का प्रयास करना चाहिए।

3

परिभाषा के अनुसार, grep लाइनों की तलाश करता है जो मेल खाते हैं; यह एक रेखा पढ़ता है, देखता है कि यह मेल खाता है, और लाइन प्रिंट करता है।

आप क्या चाहते करने के लिए एक संभव तरीका

sed साथ है:

sed -n '/HEADER TEXT/,/FOOTER TEXT/p' "[email protected]" 

पहली पंक्ति से मेल खाता है पहली पंक्ति से मेल खाता है 'पाद लेख पाठ', और फिर दोहराता के लिए 'शीर्षक पाठ' से यह प्रिंट; '-n' डिफ़ॉल्ट 'प्रिंट प्रत्येक पंक्ति' ऑपरेशन रोकता है। हेडर और पाद लेख एक ही पंक्ति पर दिखाई देने पर यह अच्छी तरह से काम नहीं करेगा।

जो भी आप चाहते हैं, करने के लिए, मैं शायद perl का उपयोग करूंगा (लेकिन यदि आप चाहें तो पाइथन का उपयोग कर सकते हैं)। मैं पूरी फ़ाइल को slurping पर विचार करना होगा, और फिर फ़ाइल के मिलान भागों को खोजने के लिए एक उपयुक्त योग्य regex का उपयोग करें। हालांकि, '@gbacon' द्वारा दिया गया पर्ल एक-लाइनर उपरोक्त 'sed' स्क्रिप्ट के पर्ल में लगभग सटीक लिप्यंतरण है और स्लर्पिंग से साफ है।

0
यहाँ

उपयोग कर रहा हूँ gawk साथ यह करने के लिए एक ही रास्ता है, अगर आप इसे

awk -vRS="FOOTER" '/HEADER/{gsub(/.*HEADER/,"");print}' file 
2

इस रूप में 'bbedit' के साथ टैग जाता है और BBedit पर्ल-शैली पैटर्न संशोधक आप डॉट स्विच के साथ लाइनब्रेक मिलान करने के लिए अनुमति दे सकते हैं समर्थन करता है, है (? रों)

0,123,

(एस)।

किसी भी चरित्र से मेल खाएगा। और हाँ, (? एस)। + पूरे पाठ से मेल खाएगा।

संबंधित मुद्दे