Opsi terbaik adalah vim / gvim seperti yang diidentifikasi oleh Shadur, tetapi jika Anda menginginkan skrip, Anda dapat memeriksa jawaban saya untuk pertanyaan serupa di Stack Overflow . Saya ulangi seluruh jawaban saya di sini:
Jika apa yang Anda coba lakukan berlaku untuk bahasa tujuan umum, maka ini adalah masalah non-sepele.
Untuk mulai dengan Anda harus khawatir tentang komentar dan string. Jika Anda ingin memeriksa ini pada bahasa pemrograman yang menggunakan ekspresi reguler, ini akan membuat pencarian Anda lebih sulit lagi.
Jadi sebelum saya bisa masuk dan memberi Anda saran tentang pertanyaan Anda, saya perlu mengetahui batas-batas area masalah Anda. Jika Anda dapat menjamin bahwa tidak ada string, tidak ada komentar dan tidak ada ekspresi reguler yang perlu dikhawatirkan - atau lebih umum lagi dalam kode yang kurung dapat digunakan selain untuk penggunaan yang Anda periksa seimbang - ini akan membuat hidup jauh lebih sederhana.
Mengetahui bahasa yang ingin Anda periksa akan sangat membantu.
Jika saya mengambil hipotesis bahwa tidak ada suara, yaitu bahwa semua tanda kurung adalah tanda kurung yang berguna, strategi saya akan berulang:
Saya hanya akan mencari dan menghapus semua pasangan braket dalam: yang tidak mengandung tanda kurung di dalamnya. Ini paling baik dilakukan dengan menciutkan semua garis menjadi satu garis panjang (dan menemukan mekanisme untuk menambahkan referensi garis, jika Anda perlu mengeluarkan informasi itu). Dalam hal ini pencarian dan penggantiannya cukup sederhana:
Itu membutuhkan sebuah array:
B["("]=")"; B["["]="]"; B["{"]="}"
Dan loop melalui elemen-elemen itu:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
File pengujian saya adalah sebagai berikut:
#!/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)
}
Skrip lengkap saya (tanpa referensi baris) adalah sebagai berikut:
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
}
'
Output dari skrip tersebut berhenti pada penggunaan kurung terdalam ilegal. Tetapi berhati-hatilah: 1 / skrip ini tidak akan bekerja dengan tanda kurung di komentar, ekspresi reguler atau string, 2 / skrip ini tidak melaporkan di mana dalam file asli masalahnya berada, 3 / meskipun skrip ini akan menghapus semua pasangan seimbang yang berhenti di bagian terdalam kondisi kesalahan dan membuat semua kurung englobbing.
Butir 3 / mungkin merupakan hasil yang dapat dieksploitasi, meskipun saya tidak yakin dengan mekanisme pelaporan yang ada dalam pikiran Anda.
Poin 2 / relatif mudah diterapkan tetapi membutuhkan waktu lebih dari beberapa menit untuk menghasilkan, jadi saya akan menyerahkannya kepada Anda untuk mencari tahu.
Butir 1 / adalah yang rumit karena Anda memasuki ranah baru yang sama sekali sama untuk permulaan dan akhir yang bersarang, atau aturan kutipan khusus untuk karakter khusus ...