2009-12-22 15 views
8

मैं एक नियमित अभिव्यक्ति की पहली घटना तक फ़ाइल की शुरुआत से डेटा कैसे प्रदर्शित करूं?मैं एक नियमित अभिव्यक्ति के पहले अवसर तक फ़ाइल की शुरुआत से डेटा कैसे प्रदर्शित करूं?

उदाहरण के लिए, मुझे लगता है कि होता है एक फ़ाइल है:

One 
Two 
Three 
Bravo 
Four 
Five 

मैं लाइन 1 से शुरू और रोकने फ़ाइल की सामग्री को प्रदर्शित करने शुरू करने के लिए जब मैं स्ट्रिंग "बी *" खोज करना चाहते हैं। तो उत्पादन इस तरह दिखना चाहिए:

One 
Two 
Three 

उत्तर

2
पर्ल में

:

perl -nle '/B.*/ && last; print; ' source.txt 
+0

/B.*/ एक बी युक्त कुछ भी मेल खाएगा, एक बी के साथ शुरू नहीं – rjh

+0

सवाल यह नहीं बताता कि 'बी' एक लाइन की शुरुआत में होना चाहिए। –

+0

क्षमा करें, आप सही हैं - यह हमारी व्याख्या पर निर्भर है। – rjh

5
sed '/^B/,$d' 

पढ़ें कि इस प्रकार है: (d) को हटाएँ पहली पंक्ति है कि एक "बी के साथ शुरू होता के साथ शुरुआत सभी लाइनों "(/^B/), ऊपर और आखिरी पंक्ति तक ($)।

0

तो पर्ल एक संभावना है, तो आप कुछ इस तरह कर सकता है:

% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE 
+0

कुछ भी करने से पहले पूरी फ़ाइल को स्मृति में पढ़ने के लिए अत्यधिक लगता है। – ephemient

7

अगर इसकी फ़ाइल की शुरुआत से

awk '/^B/{exit}1' file 

यदि आप विशिष्ट लाइन नंबर

से शुरू करना चाहते हैं
awk '/^B/{exit}NR>=10' file # start from line 10 
11

perl -pe 'last if /^B/' source.txt

बारे में स्पष्टीकरण: -p स्विच, कोड के चारों ओर एक पाश कहते हैं कि यह इस में तब्दील हो:

 
while (<>) { 
    last if /^B.*/; # The bit we provide 
    print; 
} 

अंतिम कीवर्ड आसपास के पाश तुरंत अगर हालत रखती बाहर निकल जाता है - इस मामले में,/^ बी /, जो इंगित करता है कि रेखा बी

6
sed -n '1,/^B/p' 

पंक्ति 1 से/^ बी/(समावेशी) से प्रिंट करें। -n डिफ़ॉल्ट गूंज दबाता है।


अपडेट: ऑप्स ...."ब्रावो" नहीं करना चाहता था, इसलिए बजाय रिवर्स कार्रवाई की जरूरत है ;-)

sed -n '/^B/,$!p' 

/I3az/

+0

दुर्भाग्य से, "ब्रावो" लाइन सहित यह प्रिंट, जबकि सवाल "ब्रावो" लाइन को बाहर करना चाहता है। – ndim

+0

अरघ! ... सही ढंग से प्रश्न नहीं पढ़ा। रिवर्स एक्शन "! पी" (यानी प्रिंट!) के साथ अपडेट किया गया है, जो कि/^ बी/और फ़ाइल के अंत के बीच नहीं है। इस एनडीआईएम को तलाशने के लिए बहुत धन्यवाद। – draegtun

+0

आह। '! 'एक पता श्रेणी को संशोधित करता है जैसे कि यह केवल मेल खाता है जहां यह मेल नहीं खाता है, और इसके विपरीत। यह अभी भी पता सीमा का हिस्सा है। खैर, '!' मेरे लिए नया था ... मुझे इंगित करने के लिए धन्यवाद। – ndim

1

यहाँ एक पर्ल एक लाइनर है:

perl -pe 'last if /B/' file 
2

बस कुछ साझा करने जवाब मैं प्राप्त किया है:

प्रिंट डेटा पहली पंक्ति से शुरू, और जब तक हम regex के लिए एक मैच खोजने के जारी रखते हैं, तो बंद करो:

<command> | perl -n -e 'print "$_" if 1 ... /<regex>/;' 

प्रिंट डेटा पहली पंक्ति से शुरू, और जब तक हम regex के लिए कोई मेल मिलता है जारी है, लेकिन लाइन है कि नियमित रूप से एक्सप्रेशन से मेल खाता प्रदर्शित नहीं करते:

<command> | perl -pe '/<regex>/ && exit;' 

sed में कर रहा:

<command> | sed -n '1,/<regex>/p' 
+0

फ्लिप फ्लॉप ऑपरेटर मेरे पसंदीदा में से एक है, और यह स्थिति मुझे इसका उपयोग करने के लिए कुछ बार में से एक है। :) –

3

कुछ sed कुछ अन्य लोगों द्वारा दिए गए आदेश अनावश्यक रूप से इनपुट को संसाधित करने के बाद जारी रहेगा जो बड़े इनपुट के लिए काफी धीमा हो सकता है। यह छोड़ देता है regex पाया जाता है:

sed -n '/^Bravo/q;p' 
2

आपकी समस्या perlfaq6 में एक जवाब पर एक भिन्नता है: How can I pull out lines between two patterns that are themselves on different lines?। आप पाठ और नहीं लाइनों चाहता है तो

perl -ne 'print if /START/ .. /END/' file1 file2 ... 

, आप

perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ... 

लेकिन अगर आप का प्रयोग करेंगे:


आप पर्ल के कुछ हद तक विदेशी .. ऑपरेटर (perlop में दस्तावेज) का उपयोग कर सकते START के माध्यम से START के घोंसले की घटनाएं चाहते हैं, आप संतुलित पाठ से मेल खाने पर इस खंड में प्रश्न में वर्णित समस्या के विरुद्ध भाग लेंगे।

यहाँ का उपयोग करने का एक और उदाहरण है ..:

while (<>) { 
    $in_header = 1 .. /^$/; 
    $in_body = /^$/ .. eof; 
# now choose between them 
} continue { 
    $. = 0 if eof; # fix $. 
} 
0

एक बुनियादी खोल आदेशों के साथ लाइनर:

head -`grep -n B file|head -1|cut -f1 -d":"` file 
संबंधित मुद्दे