Tùy chọn tốt nhất là vim / gvim như được xác định bởi Shadur, nhưng nếu bạn muốn có một tập lệnh, bạn có thể kiểm tra câu trả lời của tôi cho một câu hỏi tương tự trên Stack Overflow . Tôi nhắc lại toàn bộ câu trả lời của tôi ở đây:
Nếu những gì bạn đang cố gắng áp dụng cho một ngôn ngữ có mục đích chung, thì đây là một vấn đề không hề nhỏ.
Để bắt đầu với bạn sẽ phải lo lắng về ý kiến và chuỗi. Nếu bạn muốn kiểm tra điều này trên một ngôn ngữ lập trình sử dụng các biểu thức thông thường, điều này sẽ khiến nhiệm vụ của bạn trở lại khó khăn hơn.
Vì vậy, trước khi tôi có thể đến và cho bạn bất kỳ lời khuyên nào về câu hỏi của bạn, tôi cần biết giới hạn của khu vực vấn đề của bạn. Nếu bạn có thể đảm bảo rằng không có chuỗi, không có nhận xét và không có biểu thức chính quy nào phải lo lắng - hoặc nói chung là không có mã nào có thể được sử dụng ngoài các cách sử dụng mà bạn đang kiểm tra xem chúng có cân bằng không - điều này sẽ làm cho cuộc sống đơn giản hơn rất nhiều
Biết ngôn ngữ mà bạn muốn kiểm tra sẽ hữu ích.
Nếu tôi đưa ra giả thuyết rằng không có tiếng ồn, tức là tất cả các dấu ngoặc là dấu ngoặc hữu ích, chiến lược của tôi sẽ được lặp lại:
Tôi chỉ đơn giản là tìm kiếm và loại bỏ tất cả các cặp ngoặc trong: những cặp không chứa dấu ngoặc bên trong. Điều này được thực hiện tốt nhất bằng cách thu gọn tất cả các dòng thành một dòng dài duy nhất (và tìm một cơ chế để thêm các tham chiếu dòng, nếu bạn cần lấy thông tin đó ra). Trong trường hợp này, việc tìm kiếm và thay thế khá đơn giản:
Nó đòi hỏi một mảng:
B["("]=")"; B["["]="]"; B["{"]="}"
Và một vòng lặp thông qua các yếu tố đó:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Hồ sơ kiểm tra của tôi như sau:
#!/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)
}
Kịch bản đầy đủ của tôi (không có tham chiếu dòng) như sau:
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
}
'
Đầu ra của tập lệnh đó dừng trên các sử dụng trái phép trong cùng của dấu ngoặc. Nhưng hãy cẩn thận: 1 / tập lệnh này sẽ không hoạt động với dấu ngoặc trong các nhận xét, biểu thức chính quy hoặc chuỗi, 2 / nó không báo cáo vị trí của tệp gốc, 3 / mặc dù nó sẽ xóa tất cả các cặp cân bằng mà nó dừng ở trong cùng điều kiện lỗi và giữ tất cả các dấu ngoặc.
Điểm 3 / có lẽ là một kết quả có thể khai thác, mặc dù tôi không chắc về cơ chế báo cáo mà bạn có trong đầu.
Điểm 2 / tương đối dễ thực hiện nhưng phải mất hơn một vài phút để sản xuất, vì vậy tôi sẽ để bạn tự tìm hiểu.
Điểm 1 / là điểm khó khăn vì bạn tham gia vào một lĩnh vực hoàn toàn mới về cạnh tranh đôi khi bắt đầu và kết thúc, hoặc quy tắc trích dẫn đặc biệt cho các ký tự đặc biệt ...