Найкращий варіант - vim / gvim, визначений Shadur, але якщо ви хочете сценарію, ви можете перевірити мою відповідь на аналогічне запитання на Stack Overflow . Тут я повторюю всю свою відповідь:
Якщо те, що ви намагаєтеся зробити, стосується мови загального призначення, то це нетривіальна проблема.
Для початку вам доведеться турбуватися про коментарі та рядки. Якщо ви хочете перевірити це на мові програмування, яка використовує регулярні вирази, це знову зробить ваш квест важче.
Тому перш ніж я можу зайти і дати вам будь-яку пораду щодо вашого питання, мені потрібно знати межі вашої проблемної області. Якщо ви можете гарантувати відсутність рядків, зауважень та регулярних виразів, що турбуються - або ще більше ніде в коді, що дужки можуть бути використані інакше, ніж для використання, для якого ви перевіряєте, що вони врівноважені - це буде зробити життя набагато простішим.
Знання мови, яку ви хочете перевірити, було б корисно.
Якщо взяти гіпотезу, що немає шуму, тобто всі дужки є корисними дужками, моя стратегія була б ітеративною:
Я б просто шукав і видаляв усі внутрішні пари дужок: ті, що не містять дужок всередині. Найкраще це зробити, зібравши всі рядки в один довгий рядок (і знайдіть механізм для додавання посилань на рядки, якщо вам потрібно буде отримати цю інформацію). У цьому випадку пошук і заміна досить прості:
Для цього потрібен масив:
B["("]=")"; B["["]="]"; B["{"]="}"
І цикл через ці елементи:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Мій тестовий файл такий:
#!/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)
}
Мій повний сценарій (без посилання на рядки) такий:
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
}
'
Вихід цього сценарію зупиняється на найпотужнішому незаконному використанні дужок. Але будьте обережні: 1 / цей скрипт не працюватиме з дужками в коментарях, регулярних виразах чи рядках; 2 / він не повідомляє, де в оригінальному файлі знаходиться проблема, 3 / хоча він видалить усі збалансовані пари, він зупиняється на самому глибині умови помилок і зберігає всі заглиблені дужки.
Точка 3 / - це, мабуть, корисний результат, хоча я не впевнений у механізмі звітності, який ви мали на увазі.
Точка 2 / є відносно простою у виконанні, але для її виготовлення потрібно більше декількох хвилин, тож я вам залишаю це розібратися.
Точка 1 / є хитрою, тому що ви вводите цілу нову сферу конкуруючих іноді вкладених початків і закінчень або спеціальних правил цитування спеціальних символів ...