A melhor opção é vim / gvim, conforme identificado por Shadur, mas se você quiser um script, poderá verificar minha resposta para uma pergunta semelhante no Stack Overflow . Repito toda a minha resposta aqui:
Se o que você está tentando fazer se aplica a uma linguagem de uso geral, esse é um problema não trivial.
Para começar, você terá que se preocupar com comentários e strings. Se você quiser verificar isso em uma linguagem de programação que usa expressões regulares, isso tornará sua busca mais difícil novamente.
Portanto, antes que eu possa entrar e dar algum conselho sobre sua pergunta, preciso conhecer os limites da sua área problemática. Se você pode garantir que não há seqüências de caracteres, comentários ou expressões regulares para se preocupar - ou mais genericamente em nenhum lugar do código que os colchetes possam ser usados, exceto para os usos para os quais você está verificando se eles estão equilibrados - isso será tornar a vida muito mais simples.
Conhecer o idioma que você deseja verificar seria útil.
Se eu assumir a hipótese de que não há ruído, ou seja, que todos os colchetes são colchetes úteis, minha estratégia seria iterativa:
Eu simplesmente procuraria e removeria todos os pares de colchetes internos: aqueles que não contêm colchetes no interior. É melhor fazer isso recolhendo todas as linhas em uma única linha longa (e encontre um mecanismo para adicionar referências de linha, caso seja necessário obter essas informações). Nesse caso, a pesquisa e substituição são bem simples:
Requer uma matriz:
B["("]=")"; B["["]="]"; B["{"]="}"
E um loop através desses elementos:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Meu arquivo de teste é o seguinte:
#!/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)
}
Meu script completo (sem referência de linha) é o seguinte:
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
}
'
A saída desse script é interrompida nos usos ilegais mais íntimos de colchetes. Mas cuidado: 1 / este script não funcionará com colchetes nos comentários, expressões regulares ou seqüências de caracteres, 2 / não informa onde o problema está localizado no arquivo original, 3 / embora remova todos os pares balanceados que para no interior condições de erro e mantém todos os colchetes.
O ponto 3 / é provavelmente um resultado explorável, embora eu não tenha certeza do mecanismo de relatório que você tinha em mente.
O ponto 2 / é relativamente fácil de implementar, mas leva mais do que alguns minutos para produzir, portanto, deixarei que você decida.
O ponto 1 / é o mais complicado porque você entra em um novo reino de princípios e finais concorrentes, às vezes aninhados, ou regras especiais de citação para caracteres especiais ...