La mejor opción es vim / gvim según lo identificado por Shadur, pero si desea un script, puede verificar mi respuesta a una pregunta similar en Stack Overflow . Repito toda mi respuesta aquí:
Si lo que intenta hacer se aplica a un lenguaje de propósito general, entonces este es un problema no trivial.
Para comenzar, tendrá que preocuparse por los comentarios y las cadenas. Si desea verificar esto en un lenguaje de programación que utiliza expresiones regulares, esto hará que su búsqueda sea más difícil nuevamente.
Entonces, antes de que pueda entrar y darle algún consejo sobre su pregunta, necesito conocer los límites de su área problemática. Si puede garantizar que no hay cadenas, ni comentarios ni expresiones regulares de las que preocuparse, o más genéricamente en ninguna parte del código que los corchetes puedan usarse de otra manera que no sea para los usos para los que está verificando que estén equilibrados, esto Hacer la vida mucho más simple.
Sería útil conocer el idioma que desea verificar.
Si tomo la hipótesis de que no hay ruido, es decir, que todos los paréntesis son paréntesis útiles, mi estrategia sería iterativa:
Simplemente buscaría y eliminaría todos los pares de corchetes internos: aquellos que no contienen corchetes dentro. Esto se logra mejor al contraer todas las líneas en una sola línea larga (y encontrar un mecanismo para agregar referencias de línea, en caso de que necesite obtener esa información). En este caso, la búsqueda y reemplazo es bastante simple:
Requiere una matriz:
B["("]=")"; B["["]="]"; B["{"]="}"
Y un bucle a través de esos elementos:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Mi archivo de prueba es el siguiente:
#!/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)
}
Mi script completo (sin referencia de línea) es el siguiente:
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
}
'
La salida de ese script se detiene en los usos ilegales más internos de los corchetes. Pero cuidado: 1 / este script no funcionará con corchetes en los comentarios, expresiones regulares o cadenas, 2 / no informa en qué parte del archivo original se encuentra el problema, 3 / aunque eliminará todos los pares equilibrados que se detiene en lo más interno condiciones de error y mantiene todos los paréntesis envolventes.
El punto 3 / es probablemente un resultado explotable, aunque no estoy seguro del mecanismo de informes que tenía en mente.
El punto 2 / es relativamente fácil de implementar, pero lleva más de unos minutos trabajar para producirlo, así que lo dejaré a usted para que lo descubra.
El punto 1 / es el complicado porque entras en un reino completamente nuevo de comienzos y finales competitivos a veces anidados, o reglas especiales de comillas para personajes especiales ...