En iyi seçenek Shadur tarafından tanımlandığı şekilde vim / gvim'dir, ancak bir komut dosyası istiyorsanız , Stack Overflow'taki benzer bir soruya cevabımı kontrol edebilirsiniz . Burada tüm cevabımı tekrarlıyorum:
Yapmaya çalıştığınız şey genel amaçlı bir dil için geçerliyse, bu önemsiz bir sorundur.
Başlamak için yorum ve dizeler konusunda endişelenmeniz gerekecek. Bunu, düzenli ifadeler kullanan bir programlama dilinde kontrol etmek istiyorsanız, bu, arayışınızı yeniden zorlaştıracaktır.
Bu yüzden içeri girip size sorunuzla ilgili herhangi bir tavsiyede bulunmadan önce sorunlu bölgenizin sınırlarını bilmem gerekiyor. Herhangi bir karakter dizisi, yorum yok ve endişelenecek düzenli ifadeler olmadığını - ya da kodun genel olarak hiçbir yerde, parantezlerin dengeli olup olmadığını kontrol etmekte kullandıklarınız dışında kullanılabileceğini garanti edemezsiniz - bu hayatı çok daha basit hale getirir.
Kontrol etmek istediğiniz dili bilmek faydalı olacaktır.
Gürültünün olmadığı, yani tüm parantezlerin yararlı parantezler olduğu hipotezini alırsam stratejim yinelemeli olur:
İçteki parantez çiftlerini arar ve çıkarırdım: içinde parantez içermeyenleri. Bu, en iyi şekilde tüm satırları tek bir uzun satıra daraltmak suretiyle yapılır (ve satır referansları eklemek için bir mekanizma bulabilirsiniz, bu bilgiyi çıkarmanız gerekir). Bu durumda, arama ve değiştirme oldukça basittir:
Bir dizi gerektirir:
B["("]=")"; B["["]="]"; B["{"]="}"
Ve bu elementlerin arasında bir döngü:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Test dosyam aşağıdaki gibidir:
#!/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)
}
Tam betiğim (satır referansı olmadan) aşağıdaki gibidir:
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
}
'
Bu betiğin çıktısı, parantezlerin en yasa dışı kullanımında durur. Ancak dikkat: 1 / bu betiğin yorumlarda, düzenli ifadelerde veya dizelerde parantez içinde çalışmadığı, 2 / sorunun orjinal dosyada nerede bulunduğunu bildirmediği, 3 / en başta durduğu tüm dengeli çiftleri kaldıracak olmasına rağmen hata koşulları ve bütün tutma dirseklerini tutar.
Nokta 3 / muhtemelen sömürülebilir bir sonuçtur, ancak aklınızdaki raporlama mekanizmasından emin değilim.
Nokta 2 / uygulanması nispeten kolaydır ancak üretilmesi birkaç dakikadan fazla zaman alır, bu yüzden bunu çözmeniz için size bırakacağım.
Nokta 1 / yanıltıcıdır çünkü yepyeni iç içe başlangıçlar ve bitişler veya özel karakterler için özel alıntı kuralları ...