2012-12-03 49 views
5

मैं कभी-कभी टेक्स्ट फ़ाइलों के साथ काम कर रहा हूं जिसमें कुछ अनुभागों में एक ही संरचना के साथ कई पैराग्राफ होते हैं।बहु-पंक्ति अर्द्ध-संरचित सामग्री को पार्स और क्वेरी करने का सरल तरीका

Some unrelated preface I'm not interested in... Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. Etiam scelerisque. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Etiam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam scelerisque. 

001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

002 [SomeTitle 2] - Some Subtitle 2 
    Name: SomeOtherName 
    Area: SomeOtherArea 
    Content: Some other multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. 

मैं इस तरह फ़ाइलों क्वेरी करने के लिए एक आसान तरीका के लिए देख रहा हूँ: यहाँ एक उदाहरण है। उदाहरण के लिए, यदि मैं इसे "एरिया: SomeOtherArea" के लिए पूछता हूं, तो परिणाम उस क्षेत्र के साथ फ़ाइल के सभी ब्लॉक होना चाहिए। मेरा मतलब है सभी चार अनुच्छेद: शीर्षलेख, नाम, क्षेत्र, सामग्री। मैं -A और -B विकल्पों के साथ grep का उपयोग कर सकता हूं, लेकिन समस्या यह है कि सामग्री अनुच्छेदों में किसी भी संख्या में रेखाएं हो सकती हैं। और यह सिर्फ यह विशिष्ट उदाहरण है; संरचना पूरी तरह से अलग हो सकती है।

मैं हल्के वजन, आसानी से अनुकूलनीय समाधान की तलाश में हूं, शायद सीएलआई उपकरण का संयोजन। मैं पहिया को फिर से शुरू नहीं करना चाहता हूं।

+0

आपके प्रश्न पर आपके द्वारा निर्दिष्ट प्रत्येक टैग पर अपने माउस पर रोल करें। कुछ में शून्य अनुयायियों हैं। कम से कम लक्ष्य ओएस (यूनिक्स/बनाम/लिनक्स/बनाम/विंडोज़/बनाम/सिगविन/...?) और आपके साथ आरामदायक उपकरण, एक खोल शामिल करने के लिए अपने टैग बदलने के लिए बेहतर है? bash/ksh, और अपने खोज उपकरण grep जोड़ें, ?? अन्य शामिल हैं। सौभाग्य। – shellter

उत्तर

2

कहने के लिए खेद है, लेकिन अभी तक आप इस तरह की समस्या के साथ जा सकते हैं, क्योंकि आप एक शिशु सेना चाकू को सुविधाओं के असीम विस्तारित सेट के साथ चाहते हैं, लेकिन प्रोग्रामिंग के लिए आपके हिस्से पर बिना किसी दर्द के:)! ऐसी चीज मामूली संभव है, लेकिन आपके व्यापक खुले विनिर्देश को देखते हुए, याद रखें कि इस तरह की समस्या को हल करने के लिए लोग लुसीन, Google और हजारों जैसे खोज इंजनों का निर्माण करते हैं।

यह कहा गया है कि, यदि आप एक ऐसे खोज उपकरण से खुश रह सकते हैं जिसमें एक बहुत ही सरल नियम है जिसका पालन किया जाना चाहिए, और आप यूनिक्स/लिनक्स/सिगविन सिस्टम का उपयोग कर रहे हैं या इसका उपयोग कर रहे हैं, तो निम्न कार्य कर सकते हैं।

मूल नियम: प्रत्येक ब्लॉक को अलग करने जैसे रिक्त स्थान के आधार पर डेटा के ब्लॉक खोजे जाएंगे (जैसा कि आप ऊपर नमूना डेटा में हैं)।

cat paraSearch.ksh 

#!/bin/ksh 
# (or #!/bin/bash or likely others) 

case $# in 0) echo "usage:paraSearch.ksh SearchTargetPattern file2search [file2 ....]" ; exit 1 ;;esac 

# read the first pattern as the search target, 
# use quotes on cmd-line if you want to use 
# regexp chars like '*' 
mySrchPat="$1" ; shift 

#dbg set -vx 
awk -v mySrchPattern="$mySrchPat" \ 
    'BEGIN{RS=""; ORS="\n\n"} 
    #dbg {print "$0="$0; print "----------------------------------------------" } 
    $0 ~ mySrchPattern{ print $0} 
' "${@}" 

chmod 755 paraSearch.ksh 

परीक्षण अपने नमूना पाठ और searchTarget और उत्पादन

$ ./paraSearch.ksh SomeName multiLineTest.txt 
001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

का उपयोग कर, awk के बारे में अधिक जानने के लिए के माध्यम से (कई बार) को पढ़ने इस उत्कृष्ट ट्यूटोरियल: The Grymoire's Awk Tutorial

आईएचटीएच