La meilleure option est vim / gvim, telle qu'identifiée par Shadur, mais si vous voulez un script, vous pouvez vérifier ma réponse à une question similaire sur Stack Overflow . Je répète toute ma réponse ici:
Si ce que vous essayez de faire s’applique à un langage généraliste, il s’agit là d’un problème non trivial.
Pour commencer, vous devrez vous soucier des commentaires et des chaînes. Si vous voulez vérifier ceci sur un langage de programmation qui utilise des expressions régulières, cela rendra votre quête encore plus difficile.
Donc, avant que je puisse entrer et vous donner un conseil sur votre question, je dois connaître les limites de votre zone de problème. Si vous pouvez vous assurer qu'il n'y a pas de chaînes, pas de commentaires et pas d'expressions régulières à craindre - ou plus génériquement nulle part dans le code, les crochets ne peuvent éventuellement être utilisés que pour les utilisations pour lesquelles vous vérifiez qu'ils sont équilibrés - rendre la vie beaucoup plus simple.
Connaître la langue que vous souhaitez vérifier serait utile.
Si je prends l'hypothèse qu'il n'y a pas de bruit, c'est-à-dire que tous les crochets sont des crochets utiles, ma stratégie serait itérative:
Je voudrais simplement rechercher et supprimer toutes les paires de crochets intérieurs: ceux qui ne contiennent pas de crochets à l'intérieur. Pour ce faire, il est préférable de réduire toutes les lignes en une seule ligne longue (et de rechercher un mécanisme permettant d’ajouter des références de ligne si vous devez extraire ces informations). Dans ce cas, la recherche et le remplacement sont assez simples:
Cela nécessite un tableau:
B["("]=")"; B["["]="]"; B["{"]="}"
Et une boucle à travers ces éléments:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Mon fichier de test est comme suit:
#!/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)
}
Mon script complet (sans référencement de ligne) est le suivant:
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 sortie de ce script s’arrête sur les utilisations illégales les plus profondes des crochets. Mais méfiez-vous: 1 / ce script ne fonctionnera pas avec des crochets dans les commentaires, les expressions régulières ou les chaînes de caractères, 2 / il ne signale pas où se trouve le problème dans le fichier d'origine, 3 / bien qu'il supprime toutes les paires équilibrées, il s'arrête au plus profond conditions d'erreur et conserve tous les supports englobants.
Le point 3 / est probablement un résultat exploitable, bien que je ne sois pas sûr du mécanisme de rapport que vous aviez en tête.
Le point 2 / est relativement facile à mettre en œuvre mais nécessite plus de quelques minutes de travail, je vous laisse le soin de le déterminer.
Le point 1 / est délicat, car vous entrez dans un tout nouveau royaume de débuts et de fins concurrents parfois imbriqués, ou de règles de citation spéciales pour les caractères spéciaux ...