निरंतरता लाइनों के साथ grep


3

मैं कैसे कर सकते हैं grep/ awk/ sedएक फ़ाइल कुछ पैटर्न की तलाश में, और पूरे लाइन (यदि मिलान किया लाइन के साथ समाप्त होता है निरंतरता लाइनों सहित प्रिंट \?

फ़ाइल foo.txtमें शामिल हैं:

something
whatever
thisXXX line \
    has a continuation line
blahblah
a \
multipleXXX \
continuation \
line

मुझे क्या करने के लिए निष्पादित करना चाहिए (जरूरी नहीं कि एक पंक्ति में, जरूरी नहीं कि कई रिक्त स्थान हटाए जाएं):

thisXXX line has a continuation line
a multipleXXX continuation line

BTW मैं बैश और फेडोरा 21 का उपयोग कर रहा हूं, इसलिए इसे POSIX-compliant होने की आवश्यकता नहीं है (लेकिन अगर यह POSIX है तो मैं एक समाधान की सराहना करूंगा)


क्या आप चाहते हैं कि खोज निरंतरता की रेखाओं पर फैले? यानी यदि आप खोज रहे हैं hello, तो क्या hel\␤loमेल खाता है?
गाइल्स

@ गिल्स, हां, श
कार्लोस कैंपड्रेस्स

जवाबों:


5

एक नया तरीका है कि व्हाट्सएप से पहले आने वाली नई कहानियों को हटाने के लिए पर्ल का उपयोग किया जाए \:

$ perl -pe 's/\\\n/ /' file | grep XXX
thisXXX line      has a continuation line
a  multipleXXX  continuation  line

अतिरिक्त रिक्त स्थान निकालने के लिए, इसे sed के माध्यम से पास करें:

$ perl -pe 's/\\\n/ /' file | grep XXX | sed 's/  */ /g'
thisXXX line has a continuation line
a multipleXXX continuation line

चूंकि नई लाइन से पहले बैकस्लैश को अंतिम चार्ट माना जाता है, आप हटा सकते हैं \s*। और आपको gध्वज की आवश्यकता नहीं है
ग्लेन जैकमैन

@glennjackman को यकीन नहीं है कि मैं समझ सकता हूं। मुझे जी की जरूरत है क्योंकि मैं लाइन पर सभी अतिरिक्त रिक्त स्थान को निकालना चाहता हूं, ओपी के उदाहरण में कई निरंतरता के साथ एक लाइन है। मेरे पास कोई नहीं है \s
terdon

मैं आपकी पर्ल कमांड पर टिप्पणी कर रहा था, लेकिन गिल्स ने इसे ठीक कर दिया।
ग्लेन जैकमैन

@ फिर भी उसने ऐसा किया, मैं मोबाइल पर था और पूरी तरह से छूट गया। तुम दोनों को धन्यवाद।
terdon

5

POSIX sed के साथ:

$ sed -e '
:1
/\\$/{N
  s/\n//              
  t1
}
/\\/!d 
s/\\[[:blank:]]*//g
' file

@don_crissti इस पर पाइप करेंgrep XXX
Gilles

@don_crissti: मुझे XXXआवश्यकता में मेल नहीं दिखता ।
congonglm

@ गिल्स - नहीं, यह उस तरह से काम नहीं करता है। ओपी के इनपुट को पहली पंक्ति में (बिना पीछे के बैकलैश के) के somethingसाथ बदलें XXXऔर फिर इस sedकमांड को पाइप करने का प्रयास करें grep। आपको XXXअंतिम आउटपुट में लाइन नहीं मिलेगी । चिरोबा का समाधान एक समान तरीके से विफल होता है जबकि जिमिमिज दूसरी पंक्ति को भी प्रिंट करता है (यह नहीं होना चाहिए)।
17

5

बचाव के लिए पर्ल:

perl -ne 'if (/\\$/) { $l .= $_ }
          else { print $l, $_ if $l =~ /XXX/;
                 $l = "";
          }' foo.txt

$lएक संचायक के रूप में काम करता है। -nलाइन द्वारा इनपुट लाइन को प्रोसेस करता है (cf. sed), यदि लाइन बैकस्लैश में समाप्त होती है, तो इसे संचायक में जोड़ा जाता है, यदि नहीं, तो संचायक प्लस लाइन को प्रिंट किया जाता है बशर्ते यह XXX से मेल खाता हो, और संचायक खाली हो जाता है।


4

साथ pcregrepलाइनों की संरचना को बदले बिना:

pcregrep -M '^(.|\\\n)*XXX(.|\n)*?[^\\]$' file

4

मेरा ट्विस्ट:

perl -0777 -ne '                           # read the entire file into $_
    s{ [[:blank:]]* \\ \n [[:blank:]]* }   # join continued lines
     { }gx;
    print grep {/XXX/} split /(?<=\n)/     # print the matching lines
' foo.txt 
thisXXX line has a continuation line
a multipleXXX continuation line

3

मैं कहूंगा कि पर्ल यहां सबसे सरल है । यह POSIX नहीं है, हालांकि यह अधिकांश गैर-एम्बेडेड यूनियनों की डिफ़ॉल्ट स्थापना में है। यदि आप POSIX चाहते हैं, तो awk का उपयोग करें।

awk '{if (/\\$/) printf "%s" $0; else print}'

यह निरंतरता रेखाओं को ध्वस्त करता है। यदि आप ऐसे पैटर्न ढूंढना चाहते हैं जो एक निरंतरता में फैले हों, तो इसे grep में पाइप करें। यदि आप केवल निर्बाध पैटर्न से मेल खाना चाहते हैं, तो awk को निरंतर लाइनों को जमा करने दें और मिलान करें।

awk '{
    if (sub(/\\$/,"")) {
        line = line $0;
    } else {
        if (/XXX/) print;
        line = "";
    }
}'

0

यह गाइल्स ऑक सॉल्यूशन के लिए एक छोटा सा सुधार है (धन्यवाद गिल्स!), लेकिन इसके लिए नॉक की आवश्यकता होती है:

nawk '{if (/\\$/) {$0=substr($0,1,length($0)-2); printf "%s",$0} else print}'

यह एक सतत रेखा बनाएगा यदि रेखा लपेटती है, लेकिन इसमें "\" और स्थान वर्ण शामिल नहीं है। (मुझे यह मददगार तब लगा जब PATH कथनों के लिए grepping करने से "\" परिणाम की व्याख्या करते समय भ्रम पैदा हो सकता है।)

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