Die beste Möglichkeit ist vim / gvim wie Shadur identifiziert, aber wenn Sie ein Skript möchten, können Sie überprüfen , meine Antwort auf eine ähnliche Frage auf Stack - Überlauf . Ich wiederhole hier meine ganze Antwort:
Wenn das, was Sie versuchen, auf eine allgemeine Sprache zutrifft, ist dies ein nicht triviales Problem.
Zunächst müssen Sie sich um Kommentare und Zeichenfolgen kümmern. Wenn Sie dies in einer Programmiersprache überprüfen möchten, die reguläre Ausdrücke verwendet, wird dies Ihre Suche erneut erschweren.
Bevor ich Sie zu Ihrer Frage beraten kann, muss ich die Grenzen Ihres Problembereichs kennen. Wenn Sie garantieren können, dass es keine Zeichenfolgen, keine Kommentare und keine regulären Ausdrücke gibt, über die Sie sich Sorgen machen müssen, oder generell nirgendwo im Code, wo Klammern möglicherweise anders als für die Zwecke verwendet werden können, für die Sie überprüfen, ob sie ausgeglichen sind, wird dies der Fall sein das leben viel einfacher machen.
Es wäre hilfreich zu wissen, welche Sprache Sie überprüfen möchten.
Wenn ich die Hypothese annehme, dass es kein Rauschen gibt, dh dass alle Klammern nützliche Klammern sind, wäre meine Strategie iterativ:
Ich würde einfach alle inneren Klammerpaare suchen und entfernen: diejenigen, die keine Klammern enthalten. Dies geschieht am besten, indem Sie alle Zeilen zu einer einzigen langen Zeile zusammenfassen (und einen Mechanismus zum Hinzufügen von Zeilenreferenzen finden, falls Sie diese Informationen benötigen). In diesem Fall ist das Suchen und Ersetzen ziemlich einfach:
Es erfordert ein Array:
B["("]=")"; B["["]="]"; B["{"]="}"
Und eine Schleife durch diese Elemente:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Meine Testdatei lautet wie folgt:
#!/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)
}
Mein vollständiges Skript (ohne Zeilenbezug) lautet wie folgt:
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
}
'
Die Ausgabe dieses Skripts stoppt bei der innersten illegalen Verwendung von Klammern. Aber Vorsicht: 1 / Dieses Skript funktioniert nicht mit eckigen Klammern in Kommentaren, regulären Ausdrücken oder Zeichenfolgen. 2 / Es meldet nicht, wo sich das Problem in der Originaldatei befindet. 3 / Obwohl alle ausgeglichenen Paare entfernt werden, die es im Innersten stoppt Fehlerbedingungen und behält alle englischen Klammern.
Punkt 3 / ist wahrscheinlich ein verwertbares Ergebnis, obwohl ich mir nicht sicher bin, welchen Berichtsmechanismus Sie im Sinn hatten.
Punkt 2 / ist relativ einfach zu implementieren, benötigt jedoch mehr als ein paar Minuten Arbeit, sodass ich es Ihnen überlassen werde, dies herauszufinden.
Punkt 1 / ist schwierig, weil Sie einen völlig neuen Bereich konkurrierender, manchmal verschachtelter Anfänge und Enden oder spezieller Anführungsregeln für Sonderzeichen betreten ...