2011-05-28 11 views
7

साथ सन्निहित मैचों के संदर्भ आपस में न मिलाएंग्रेप

b 
match1 
c 
-- 
e 
match2 
f 
match3 
g 

आप देख सकते हैं, संदर्भ के बाद से संगत मैचों "मैच 2" और "मैच 3" ओवरलैप के आसपास, वे विलय कर रहे हैं। हालांकि, मैं संदर्भ मिलान में इनपुट से लाइनों को डुप्लिकेट करने के लिए प्रत्येक मैच के लिए एक संदर्भ विवरण प्राप्त करना पसंद करूंगा। इस मामले में, मुझे क्या चाहिए:

b 
match1 
c 
-- 
e 
match2 
f 
-- 
f 
match3 
g 

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा? मैं उन समाधानों को प्राथमिकता दूंगा जो अन्य grep विकल्पों (-A, -B, -C, या पूरी तरह से अलग झंडे के लिए अलग-अलग मान) के लिए छोटे रूप से अनुकूलनीय होने के लिए सामान्य हैं। आदर्श रूप में, मैं उम्मीद कर रहा था कि grep के साथ ऐसा करने का एक चालाक तरीका था ....

उत्तर

2

मुझे नहीं लगता कि सादा grep का उपयोग करना संभव है।

sed निर्माण नीचे कुछ हद तक काम करता है, अब मैं केवल जोड़ने का तरीका यह पता लगाने की जरूरत है "-" विभाजक

$ sed -n -e '/match/{x;1!p;g;$!N;p;D;}' -e h log 
b 
match1 
c 
e 
match2 
f 
f 
match3 
g 
+1

वह आउटपुट वह पहले से ही प्राप्त कर रहा है; वह कुछ और चाहता था। उत्तर देने से पहले प्रश्न पढ़ें। –

+0

वहां तेजी से, क्षमा करें! –

+0

यह सही नहीं है, क्योंकि यदि आप -C, या -A या -B के अलग-अलग मान रखना चाहते हैं तो आपको एक गैर-स्पष्ट तरीके से sed अभिव्यक्ति को बदलना होगा ... अन्य 'grep' का उपयोग करके उल्लेख नहीं करना चाहिए विकल्प। – a3nm

3

मुझे नहीं लगता कि इस मैदान ग्रेप का उपयोग कर संभव है।

क्या आपने कभी पाइथन का उपयोग किया है? मेरी राय में यह इस तरह के कार्यों के लिए एक आदर्श भाषा है (इस कोड स्निपेट दोनों अजगर 2.7 और 3.x के लिए काम करेंगे):

with open("your_file_name") as f: 
    lines = [line.rstrip() for line in f.readlines()] 
    for num, line in enumerate(lines): 
     if "match" in line: 
     if num > 0: 
      print(lines[num - 1]) 

     print(line) 

     if num < len(lines) - 1: 
      print(lines[num + 1]) 
      if num < len(lines) - 2: 
       print("--") 

यह मैं देता है:

b 
match1 
c 
-- 
e 
match2 
f 
-- 
f 
match3 
g 
+0

इसे 'grep' के अधिक विस्तृत उपयोग के लिए अनुकूलित करने की आवश्यकता होगी। इस लापता विकल्प की वजह से यह एक सरल तरीके से मिलान को पुन: कार्यान्वित करने के लिए असंतोषजनक लगता है ('grep' इसे बहुत चालाक तरीके से करता है)। वैसे भी, सुझाव के लिए धन्यवाद! – a3nm

1

मैं डी इसके आसपास काम करने के बजाय gatch पैच करने का सुझाव है। जीएनयू grep 2.9 में src/main.cpp:

933  /* We print the SEP_STR_GROUP separator only if our output is 
934   discontiguous from the last output in the file. */ 
935  if ((out_before || out_after) && used && p != lastout && group_separator) 
936   { 
937   PR_SGR_START_IF(sep_color); 
938   fputs (group_separator, stdout); 
939   PR_SGR_END_IF(sep_color); 
940   fputc('\n', stdout); 
941   } 
942 

एक साधारण अतिरिक्त ध्वज पर्याप्त होगा।

संपादित करें: ठीक है, ओह, यह निश्चित रूप से इतना आसान नहीं है क्योंकि grep संदर्भ को पुन: उत्पन्न नहीं करेगा, बस कुछ और विभाजक जोड़ें। Grep की रैखिकता के कारण, पूरे पैच शायद इतना आसान नहीं है। फिर भी, यदि आपके पास पैच के लिए अच्छा मामला है, तो यह इसके लायक हो सकता है।

0

यह grep या GNU grep के साथ संभव नहीं दिखता है। हालांकि वांछित आउटपुट प्राप्त करने के लिए मानक पॉज़िक्स उपकरण और बैश जैसे अच्छे खोल के साथ यह संभव है।
नोट: समाधान के लिए न तो अजगर और न ही पर्ल आवश्यक होना चाहिए। सबसे खराब मामला, अजीब या sed का उपयोग करें।

एक समाधान जिसे मैं तेजी से प्रोटोटाइप करता हूं वह इस तरह कुछ है (इसमें फ़ाइल को फिर से पढ़ने का ओवरहेड शामिल है, और यह समाधान इस ओवरहेड ठीक है या नहीं, और देरी-मूल मूल प्रश्न का उपयोग -1 है संदर्भ से लाइनों की निश्चित संख्या है) सिर & पूंछ के सरल उपयोग की अनुमति देता है:

$ OIFS="$IFS"; lines=`grep -n match greptext.txt | /bin/cut -f1 -d:`; 
for l in $lines; 
do IFS=""; match=`/bin/tail -n +$(($l-1)) greptext.txt | /bin/head -3`; 
echo $match; echo "---"; 
done; IFS="$OIFS" 

यह इसके साथ जुड़े कुछ कोने मामले हो सकता है, और यह भारतीय विदेश सेवा रीसेट करता है जब शायद जरूरी नहीं है, हालांकि यह कोशिश कर के लिए एक संकेत है वांछित आउटपुट प्राप्त करने के लिए उच्च स्तर के दुभाषिया के बजाय POSIX खोल & उपकरण की शक्ति का उपयोग करने के लिए।

राय: सभी अच्छे ऑपरेटिंग सिस्टम में: grep, awk, sed, tr, cut, head, पूंछ, अधिक, कम, vi अंतर्निर्मित के रूप में हैं। सर्वोत्तम ऑपरेटिंग सिस्टम पर, ये/बिन में हैं।

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