Najlepszą opcją jest vim / gvim zidentyfikowany przez Shadura, ale jeśli chcesz skrypt, możesz sprawdzić moją odpowiedź na podobne pytanie dotyczące przepełnienia stosu . Powtarzam całą odpowiedź tutaj:
Jeśli to, co próbujesz zrobić, dotyczy języka ogólnego przeznaczenia, jest to nietrywialny problem.
Na początek będziesz musiał martwić się o komentarze i ciągi znaków. Jeśli chcesz to sprawdzić w języku programowania, który używa wyrażeń regularnych, sprawi to, że twoje zadanie będzie trudniejsze.
Więc zanim będę mógł udzielić ci porady na twoje pytanie, muszę znać granice obszaru, w którym masz problem. Jeśli możesz zagwarantować, że nie ma żadnych ciągów, komentarzy i wyrażeń regularnych, o które należy się martwić - lub bardziej ogólnie, nigdzie w kodzie nie można użyć nawiasów innych niż do zastosowań, dla których sprawdzasz, czy są zrównoważone - spowoduje to uprościć życie.
Pomocna byłaby znajomość języka, który chcesz sprawdzić.
Jeśli przyjmuję hipotezę, że nie ma hałasu, tzn. Że wszystkie nawiasy są nawiasami użytecznymi, moja strategia byłaby iteracyjna:
Po prostu szukałem i usuwałem wszystkie pary nawiasów wewnętrznych: te, które nie zawierają nawiasów w środku. Najlepiej to zrobić, zwijając wszystkie linie do pojedynczej długiej linii (i znajdź mechanizm dodawania odniesień do linii, jeśli zajdzie taka potrzeba). W takim przypadku wyszukiwanie i zamiana jest dość proste:
Wymaga tablicy:
B["("]=")"; B["["]="]"; B["{"]="}"
I pętla przez te elementy:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Mój plik testowy wygląda następująco:
#!/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)
}
Mój pełny skrypt (bez odwoływania się do wiersza) wygląda następująco:
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
}
'
Dane wyjściowe tego skryptu zatrzymują się w najbardziej wewnętrznych nielegalnych zastosowaniach nawiasów. Ale uwaga: 1 / ten skrypt nie będzie działał z nawiasami w komentarzach, wyrażeniach regularnych lub ciągach, 2 / nie zgłasza, gdzie w oryginalnym pliku znajduje się problem, 3 / chociaż usunie wszystkie zrównoważone pary, zatrzymuje się w głębi warunek błędu i zachowuje wszystkie nawiasy englobbing.
Punkt 3 / jest prawdopodobnie rezultatem możliwym do wykorzystania, chociaż nie jestem pewien mechanizmu raportowania, który miałeś na myśli.
Punkt 2 / jest stosunkowo łatwy do wdrożenia, ale jego opracowanie zajmuje więcej niż kilka minut, więc zostawię to tobie.
Punkt 1 / jest trudny, ponieważ wchodzisz w zupełnie nową dziedzinę konkurujących czasami zagnieżdżonych początków i zakończeń lub specjalnych zasad cytowania znaków specjalnych ...