सबसे अच्छा विकल्प शादुर द्वारा पहचाना गया vim / gvim है, लेकिन यदि आप एक स्क्रिप्ट चाहते हैं, तो आप स्टैक ओवरफ्लो पर एक समान प्रश्न के लिए मेरे उत्तर की जांच कर सकते हैं । मैं यहाँ अपना पूरा उत्तर दोहराता हूँ:
यदि आप जो करने की कोशिश कर रहे हैं वह एक सामान्य प्रयोजन की भाषा पर लागू होता है, तो यह एक गैर-तुच्छ समस्या है।
शुरुआत करने के लिए आपको टिप्पणियों और तार के बारे में चिंता करनी होगी। यदि आप नियमित अभिव्यक्ति का उपयोग करने वाली प्रोग्रामिंग भाषा पर यह जांचना चाहते हैं, तो यह आपकी खोज को फिर से कठिन बना देगा।
इसलिए इससे पहले कि मैं अंदर आ सकूं और आपके सवाल पर आपको कोई सलाह दूं, मुझे आपके समस्या क्षेत्र की सीमाएं जानने की जरूरत है। यदि आप यह गारंटी दे सकते हैं कि चिंता करने के लिए कोई तार, कोई टिप्पणी और कोई नियमित अभिव्यक्ति नहीं है - या अधिक उदारता से कोड में कहीं भी नहीं है कि कोष्ठक संभवतः उन उपयोगों के अलावा अन्य उपयोग किए जा सकते हैं जिनके लिए आप जाँच कर रहे हैं कि वे संतुलित हैं - यह होगा जीवन को बहुत सरल बनाओ।
उस भाषा को जानना, जिसे आप जांचना चाहते हैं, सहायक होगा।
अगर मैं परिकल्पना लेता हूं कि कोई शोर नहीं है, अर्थात सभी कोष्ठक उपयोगी कोष्ठक हैं, तो मेरी रणनीति पुनरावृत्ति होगी:
मैं बस सभी आंतरिक ब्रैकेट जोड़े को खोजूंगा और हटाऊंगा: जिनके अंदर कोई ब्रैकेट नहीं हैं। यह सबसे अच्छी तरह से सभी लाइनों को एक ही लंबी लाइन को ध्वस्त करके किया जाता है (और लाइन संदर्भ जोड़ने के लिए एक तंत्र ढूंढें, क्या आपको उस जानकारी को प्राप्त करने की आवश्यकता है)। इस मामले में खोज और प्रतिस्थापित बहुत सरल है:
इसके लिए एक सरणी चाहिए:
B["("]=")"; B["["]="]"; B["{"]="}"
और उन तत्वों के माध्यम से एक लूप:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
मेरी परीक्षा फ़ाइल इस प्रकार है:
#!/bin/awk
($1 == "PID") {
fo (i=1; i<NF; i++)
{
F[$i] = i
}
}
($1 + 0) > 0 {
count("VIRT")
count("RES")
count("SHR")
count("%MEM")
}
END {
pintf "VIRT=\t%12d\nRES=\t%12d\nSHR=\t%12d\n%%MEM=\t%5.1f%%\n", C["VIRT"], C["RES"], C["SHR"], C["%MEM"]
}
function count(c[)
{
f=F[c];
if ($f ~ /m$/)
{
$f = ($f+0) * 1024
}
C[c]+=($f+0)
}
मेरी पूरी स्क्रिप्ट (बिना लाइन रेफरेंस के) इस प्रकार है:
cat test-file-for-brackets.txt | \
tr -d '\r\n' | \
awk \
'
BEGIN {
B["("]=")";
B["["]="]";
B["{"]="}"
}
{
m=1;
while(m>0)
{
m=0;
for (b in B)
{
m+=gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)
}
};
print
}
'
उस स्क्रिप्ट का आउटपुट ब्रैकेट्स के अंतरतम अवैध उपयोगों पर रुक जाता है। लेकिन सावधान रहें: 1 / यह स्क्रिप्ट टिप्पणियों, नियमित अभिव्यक्तियों या स्ट्रिंग्स में कोष्ठक के साथ काम नहीं करेगी, 2 / यह रिपोर्ट नहीं करता है कि मूल फ़ाइल में समस्या कहाँ स्थित है, 3 / हालांकि यह सभी संतुलित जोड़े को हटा देगा, जो कि अंतरतम पर रुक जाता है त्रुटि की स्थिति और सभी कोष्ठक कोष्ठक रखता है।
पॉइंट 3 / शायद एक शोषणकारी परिणाम है, हालाँकि मुझे आपके द्वारा बताए गए रिपोर्टिंग तंत्र के बारे में निश्चित नहीं है।
पॉइंट 2 / को लागू करना अपेक्षाकृत आसान है, लेकिन उत्पादन करने में कुछ मिनट से अधिक समय लगता है, इसलिए मैं इसका पता लगाने के लिए आपको छोड़ दूंगा।
बिंदु 1 / एक मुश्किल है, क्योंकि आप कभी-कभी नेस्टेड शुरुआत और अंत, या विशेष वर्णों के लिए विशेष उद्धरण नियमों के साथ प्रतिस्पर्धा के एक पूरे नए दायरे में प्रवेश करते हैं ...