가장 좋은 옵션은 Shadur가 식별 한 vim / gvim이지만 스크립트를 원한다면 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 / 원본 파일에서 문제가있는 위치를보고하지 않습니다. 오류 조건 및 모든 괄호 괄호를 유지합니다.
Point 3 /은 아마도 악용 가능한 결과이지만, 내가보고 한보고 메커니즘을 잘 모르겠습니다.
Point 2 /는 구현하기가 상대적으로 쉽지만 생성하는 데 몇 분 이상 걸리므로 알아낼 수 있도록 맡겨 두겠습니다.
포인트 1 /은 까다로운 부분입니다. 때로는 중첩 된 시작과 끝 또는 특수 문자에 대한 특별 인용 규칙과 경쟁하는 완전히 새로운 영역을 입력하기 때문입니다 ...