ตัวเลือกที่ดีที่สุดคือเป็นกลุ่ม / gvim ที่ระบุไว้โดย Shadur แต่ถ้าคุณต้องการสคริปต์คุณสามารถตรวจสอบคำตอบของฉันจะเป็นคำถามที่คล้ายกันในกองมากเกิน ฉันทำซ้ำคำตอบทั้งหมดของฉันที่นี่:
หากสิ่งที่คุณพยายามจะนำไปใช้กับภาษาที่ใช้โดยทั่วไปแล้วนี่เป็นปัญหาที่ไม่สำคัญ
เริ่มต้นด้วยคุณจะต้องกังวลเกี่ยวกับความคิดเห็นและสตริง หากคุณต้องการตรวจสอบสิ่งนี้ในภาษาการเขียนโปรแกรมที่ใช้นิพจน์ทั่วไปสิ่งนี้จะทำให้ภารกิจของคุณหนักขึ้นอีกครั้ง
ดังนั้นก่อนที่ฉันจะเข้ามาและให้คำแนะนำกับคำถามของคุณฉันจำเป็นต้องรู้ขอบเขตของปัญหาของคุณ หากคุณสามารถรับประกันได้ว่าไม่มีสตริงไม่มีความคิดเห็นและไม่มีการแสดงออกปกติที่ต้องกังวล - หรือไม่มีรหัสทั่วไปที่วงเล็บสามารถนำไปใช้นอกเหนือจากการใช้งานที่คุณกำลังตรวจสอบว่ามีความสมดุล - สิ่งนี้จะ ทำให้ชีวิตง่ายขึ้นมาก
การรู้ภาษาที่คุณต้องการตรวจสอบจะเป็นประโยชน์
หากฉันใช้สมมุติฐานว่าไม่มีเสียงดังกล่าวนั่นคือทุกวงเล็บเป็นวงเล็บเหลี่ยมที่มีประโยชน์กลยุทธ์ของฉันจะเป็นแบบวนซ้ำ:
ฉันเพียงแค่มองหาและลบคู่วงเล็บภายในทั้งหมด: สิ่งเหล่านั้นที่ไม่มีวงเล็บอยู่ภายใน สิ่งนี้ทำได้ดีที่สุดโดยการยุบบรรทัดทั้งหมดเป็นบรรทัดยาวเดี่ยว (และค้นหากลไกเพื่อเพิ่มการอ้างอิงบรรทัดหากคุณต้องการข้อมูลนั้นออกมา) ในกรณีนี้การค้นหาและแทนที่ง่าย ๆ :
มันต้องมีอาร์เรย์:
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 / แม้ว่ามันจะลบคู่ที่สมดุลทั้งหมดที่จะหยุดที่ด้านในสุด เงื่อนไขข้อผิดพลาดและช่วยให้วงเล็บทั้งหมด englobbing
จุดที่ 3 / อาจเป็นผลลัพธ์ที่เอาเปรียบแม้ว่าฉันจะไม่แน่ใจเกี่ยวกับกลไกการรายงานที่คุณมีอยู่ในใจ
จุดที่ 2 / ใช้งานง่าย แต่ใช้เวลามากกว่าสองสามนาทีในการผลิตดังนั้นฉันจะปล่อยให้คุณคิดออก
จุดที่ 1 / เป็นสิ่งที่ยุ่งยากเนื่องจากคุณเข้าสู่อาณาจักรใหม่ของการแข่งขันบางครั้งการเริ่มต้นและการสิ้นสุดที่ซ้อนกันหรือกฎการอ้างอิงพิเศษสำหรับอักขระพิเศษ ...