एकाधिक लाइनों पर पैटर्न खोजें?

मैं किसी भी पंक्ति के साथ किसी भी पंक्ति के साथ 3 शब्दों का एक पैटर्न खोजने की कोशिश कर रहा हूं। वर्तमान में, मैं इस तरह pcregrep का उपयोग कर रहा हूँ (-एम multiline के लिए है):

sep=$( echo ".*\n.*" )

find . -name "$FILE" 2>null | xargs pcregrep -M "string1($sep)string2($sep)string3" >> $grep_out

और मुझे यह परिणाम मिलता है:

./testing/test.txt:   let prep = "select string1, dog from cat",
              " where string2 = 1",
              " and string3 = ?",

जो माहान है। हालांकि, मैं चाहता हूं कि यह पैटर्न इन 3 तारों को कई नई लाइनों पर ढूंढें - न कि लगातार। उदाहरण के लिए, मैं यह परिणाम प्राप्त करना चाहता हूं:

./testing/test.txt:   let prep = "select string1, dog from cat",
              " where apple = 1",
              " and string2 = 2",
              " and grass = 8",
              " and string3 = ?",

यह समझ में आता है कि मेरा पैटर्न अभी उपर्युक्त परिणाम से मेल नहीं खाता है, क्योंकि यह केवल एक ही नई लाइन की तलाश में है। तो, मुझे लगता है कि इस तरह से मेरे कोड को बदलने से यह ठीक हो जाएगा ($ sep चर बदल रहा है और खोज पैटर्न में तारांकन जोड़ रहा है):

sep=$( echo ".|\n" )

find . -name "$FILE" 2>null | xargs pcregrep -M "string1($sep)*string2($sep)*string3" >> $grep_out

लेकिन अब यह कोई परिणाम नहीं मिला है। कोष्ठक के अंदर तारों को डालने से कोई परिणाम नहीं मिलता है। तो मैं अभी भी एक पैटर्न की तलाश कर रहा हूं जो मेरे 3 तारों के बीच, न्यूलाइन समेत किसी भी चरित्र के 0 या अधिक की अनुमति देगा।

0
क्या इन मल्टी-लाइन तारों के बीच खाली रेखाएं हो सकती हैं?
जोड़ा लेखक anubhava, स्रोत

1 उत्तर

find . -name "$FILE" 2>/dev/null -execdir \
sh -c "grep -aA999999 string1 '"{}"' | grep -aA999999 string2 | grep -q string3" \
';' -print

जो स्ट्रिंग 1, स्ट्रिंग 2 और स्ट्रिंग 3 के बीच 99 99 99 लाइनों तक सीमित है।

\ के बाद रिक्त स्थान न रखें।

0
जोड़ा
मैं अजीब का उपयोग करने के लिए खुला हूं, अगर आप जानते हैं कि कैसे।
जोड़ा लेखक user1472747, स्रोत
अजीब के साथ आप बेहतर कर सकते हैं।
जोड़ा लेखक user2987828, स्रोत