ग्रीप: प्रति पंक्ति मैचों की संख्या


26

मैं मैचों की संख्या प्राप्त करने के लिए (इस मामले में की घटनाओं कोशिश कर रहा हूँ {या }एक .tex फ़ाइल की प्रत्येक पंक्ति में)।

मुझे पता है कि -oध्वज केवल मैच लौटाता है, लेकिन यह प्रत्येक मैच को एक नई लाइन पर लौटाता है, यहां तक ​​कि -nध्वज के साथ भी । मुझे कुछ भी पता नहीं है कि मैं इसे दोहराता हूं। -cझंडा केवल पूरी फ़ाइल में मैचों की कुल संख्या रिटर्न - शायद मैं एक समय में पाइप लाइन एक grep के लिए कर सकता है?

जवाबों:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

आउटपुट कुछ इस तरह होगा:

3 1
1 2

मतलब पहली पंक्ति में 3 घटनाएँ और दूसरी में 1 घटनाएँ।

Https://stackoverflow.com/a/15366097/3378354 से लिया गया ।


धन्यवाद - google ने SU पर बहुत सारे regex हिट पाए, लेकिन एसओ पर ऐसा नहीं है, जो regex टैग नहीं लगता है। यह sortकड़ाई से आवश्यक नहीं है क्योंकि grep का आउटपुट लाइन नंबर द्वारा सॉर्ट किया जाता है, लेकिन मुझे लगता है कि यह पहले अच्छा अभ्यास है uniq
क्रिस एच।

2
शायद टैग नहीं किया गया regexक्योंकि रेगेक्स आसान हिस्सा है।
टॉम जिक

क्या यह वास्तव में आवश्यक है sort -n? क्या यह वैसे भी लाइन नंबर ऑर्डर में नहीं आया है?
टॉम ज़िक

आप सही हैं, sort -nजरूरी नहीं है। धन्यवाद।
मोएबियस

@ टॉमीज़िक, यह पता चला कि आप सही थे, लेकिन क्या मुझे पता था कि मैंने नहीं पूछा होगा। Grep से टैग के लिए मानसिक छलांग: regex शायद बहुत अधिक था, हालांकि।
क्रिस एच

3

विभिन्न समाधानों को पढ़ने के बाद, मुझे लगता है कि यह समस्या का सबसे आसान तरीका है:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
सबसे अच्छा समाधान, मेरी राय में। एक पाइप को कम करके और भी सरल बनाया जा सकता है grep -o "matchingString" <<< $i | wc -l:।
बेंजामिन डब्ल्यू।

1
यह परिमाण धीमी करने के आदेश फिर अन्य विकल्प होंगे
राहुल

1

grepएक आवश्यकता का उपयोग कर रहा है? यहाँ एक विकल्प है:

sed 's / [^ {}] // g' your_file | awk '{प्रिंट एनआर, लंबाई}'

sedके अलावा अन्य सभी पात्रों बाहर स्ट्रिप्स {और } (यानी, केवल छोड़ने {और }वर्ण), और उसके बाद awkकी गिनती के पात्रों प्रत्येक पंक्ति पर (जो सिर्फ कर रहे हैं {और }अक्षर)। बिना किसी मिलान के लाइनों को दबाने के लिए,

sed 's / [^ {}] // g' your_file | awk '/ / / {प्रिंट एनआर, लंबाई}'

ध्यान दें कि मेरा समाधान मानता है (आवश्यकता है) कि आप जिस तार की तलाश कर रहे हैं वह एकल वर्ण हैं। मोएबियस का उत्तर अधिक आसानी से मल्टी-कैरेक्टर स्ट्रिंग्स के अनुकूल है। इसके अलावा, हमारे जवाबों में से न तो वर्णों को छोड़ दिया जाता है और न ही ब्याज के पात्रों / तार के घटित होने से बच जाता है; जैसे,

{ "nullfunc() {}" }

चार ब्रेस पात्रों को शामिल माना जाएगा।


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

मुझे पूरा यकीन नहीं है कि आप "ब्रैकेट के अनुसार एक बार स्क्रिप्ट चलाएं" से क्या मतलब है, लेकिन अगर आप ब्रेस मिसमैच को ट्रैक करना चाहते हैं, तो आप कुछ ऐसा प्रयास करना चाह सकते हैं sed 's/{[^{}]*}//g' your_file | grep –n '[{}]', जहां sedस्ट्रिप्स (मिलान) जोड़े। यदि आपके पास नेस्टेड जोड़े हैं, तो अपने गहरे घोंसले के शिकार sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …के s/{[^{}]*}//gरूप में कई बार दोहराएं।
स्कॉट

मेरा मतलब था कि 'sed' s / [^}] // g 'your_file | awk '{प्रिंट NR, लंबाई}' और 's / [^ {] // g' your_file | awk '{प्रिंट एनआर, लंबाई}'। मेरे पास वास्तव में घोंसले के शिकार हैं, और सबसे गहरे स्तर पर काम करना एक ठाठ की तरह लग रहा था। कई पंक्तियों को एक मुट्ठी में बदलना (कुछ मामले हैं जहां केवल वैध कारणों के लिए कई लाइनों पर ब्रेसिज़ मेल खाते हैं) अच्छी तरह से काम किया (मैं जेडिट का उपयोग करता हूं जो मिलान ब्रैकेट को उजागर करता है - किसी भी प्रकार के ब्रैकेट के लिए इसे समझता है - इसलिए मैंने वास्तव में किया था बस इसे संकीर्ण करने की आवश्यकता है)।
क्रिस एच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.