कैसे (grep) पैराग्राफ शब्द के साथ शुरू होता है और दूसरे शब्द से समाप्त होता है और नई लाइन को अनदेखा करता है?


3

मैं एक पैराग्राफ खोजना चाहता हूं जो फाइलों की एक सूची है। उदाहरण के लिए SQL कथन जो दिखता है:

upadte b_table
set number = 100014
where id in (
            select number_desc from t_table
            where id > 100);

मुझे प्रवेश / नई लाइनों को कैसे अनदेखा करना चाहिए?

मुझे एक पैराग्राफ ढूंढना / प्रिंट करना होगा जो "अपडेट" से शुरू होता है और पहली घटना के साथ खत्म होता है ;

जवाबों:


3

बैरीज के संक्षिप्त जाग समाधान से प्रेरित:

perl -ne 'print if /update/../;/' *.sql

यदि अपडेट स्टेटमेंट्स (खाली-पंक्ति सीमांकित) पैराग्राफ में समाहित हैं

perl -00 -ne 'print if /update.*?;/' *.sql

- से http://uselessuseofcat.com/?p=381

अन्यथा, यह फ़ाइल नाम और अद्यतन कथन प्रिंट करता है:

perl -ne 'BEGIN{undef $/}; print "$ARGV\t$.\t$1\n" if m/(update.*?;)/mg' *.sql

- से http://www.commandlinefu.com/commands/view/5087/multi-line-grep

(अप्रकाशित - कैविएट एम्प्टर)


ठीक है - मैं इस तरह regexp के साथ grep इस्तेमाल किया:
user84129

3

grep नई कहानियों के साथ थोड़ा मुश्किल है, लेकिन आप जाग के साथ कुछ करने की कोशिश कर सकते हैं:

awk '/update/,/;/' < filename.sql

आप कई अपडेट स्टेटमेंट वाली फ़ाइल से कैसे निपटेंगे?
RedGrittyBrick

@RedGrittyBrick - उपर्युक्त कथन को मिलान शुरू करने और भागों को रोकने के साथ सभी विवरणों को मुद्रित करना चाहिए मुझे लगता है कि यह आवश्यक है।
barryj

0

मैंने इस तरह से grep का उपयोग किया:

grep -ihRP  '^(update|( )* update) .* [^;]*;'

perl इंजन के साथ grep का उपयोग करना अन्य बुद्धिमान रेगेक्स bash में "अच्छा" काम नहीं करता है और इसके अलावा सब कुछ प्रिंट करता है; शब्द "अपडेट" या "अपडेट" के बाद पहली उपस्थिति तक;
user84129
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.