L'opzione migliore è vim / gvim come identificato da Shadur, ma se vuoi uno script, puoi controllare la mia risposta a una domanda simile su Stack Overflow . Ripeto tutta la mia risposta qui:
Se ciò che stai cercando di fare si applica a un linguaggio generico, allora questo è un problema non banale.
Per cominciare dovrai preoccuparti di commenti e stringhe. Se vuoi verificarlo su un linguaggio di programmazione che utilizza espressioni regolari, questo renderà di nuovo più difficile la tua ricerca.
Quindi, prima di poter entrare e darti qualche consiglio sulla tua domanda, devo conoscere i limiti della tua area problematica. Se puoi garantire che non ci sono stringhe, commenti o espressioni regolari di cui preoccuparti - o più genericamente da nessuna parte nel codice che le parentesi possono essere usate se non per gli usi per i quali stai controllando che siano bilanciate - questo farà rendere la vita molto più semplice.
Conoscere la lingua che si desidera controllare sarebbe utile.
Se prendo l'ipotesi che non ci sia rumore, cioè che tutte le parentesi siano parentesi utili, la mia strategia sarebbe iterativa:
Vorrei semplicemente cercare e rimuovere tutte le coppie di parentesi interne: quelle che non contengono parentesi all'interno. Questo è fatto meglio comprimendo tutte le linee su una singola linea lunga (e trovare un meccanismo per aggiungere riferimenti di linea, nel caso in cui fosse necessario ottenere tali informazioni). In questo caso la ricerca e la sostituzione è piuttosto semplice:
Richiede un array:
B["("]=")"; B["["]="]"; B["{"]="}"
E un ciclo attraverso quegli elementi:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Il mio file di test è il seguente:
#!/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)
}
Il mio script completo (senza riferimento alla riga) è il seguente:
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
}
'
L'output di quello script si interrompe negli usi più interni illegali delle parentesi. Ma attenzione: 1 / questo script non funziona con parentesi nei commenti, espressioni regolari o stringhe, 2 / non riporta dove si trova il problema nel file originale, 3 / sebbene rimuoverà tutte le coppie bilanciate si ferma al più interno condizioni di errore e mantiene tutte le parentesi coinvolgenti.
Il punto 3 / è probabilmente un risultato sfruttabile, anche se non sono sicuro del meccanismo di segnalazione che avevi in mente.
Il punto 2 / è relativamente facile da implementare ma richiede più di qualche minuto per essere prodotto, quindi lascerò a te capire.
Il punto 1 / è difficile perché si entra in un regno completamente nuovo di inizi e finali a volte annidati concorrenti o regole speciali di quotazione per personaggi speciali ...