{}
블록 내부에서 패턴이 발견되면 중괄호 블록 + "이름"(2단어 접두사)을 제거하고 싶습니다. 마법을
좀 써봤지만 sed
효과가 없었어요.
예를 들어:
- 무늬:패턴 패턴-X
입력하다
m m1 {
s s1;
s s2;
c c1 {
s s3;
c c2 {
PATTERN PATTERN-X
...
}
s s4;
}
c c3 {
PATTERN PATTERN-X
...
c c4 {
s s4;
}
}
}
산출
m m1 {
s s1;
s s2;
c c1 {
s s3;
s s4;
}
}
답변1
이것을 시도해 볼 수 있습니다.
awk '
$0~/{/{
if(b) {
print b
b=""
}
if(c)
c++
}
$0~/PATTERN/ {
b=""
c=2
}
$0~/}/ {
if(c)
c--
}
!c {
if(b)
b=b RS
b=b $0
}
END {
print b
}
' infile
답변2
이 예제처럼 기능적 언어를 구문 분석하는 것은 일반적으로 좋은 생각이 아닙니다. 정규식을 처리하도록 설계된 구문 분석 도구는 인간 언어에서 잘 작동합니다. 그렇긴 하지만... 아직 시도해 볼 수는 있습니다.
이것이 내가 사용하는 방법입니다 pcregrep
.
pcregrep -Mv '.*{.*\n.*PATTERN(([^{}]|\n)*|([^{}]|\n)*{([^{}]|\n)*}.*([^{}]|\n)*)}.*' file
귀하의 예와 잘 작동합니다. 즉, {}
뒤에 블록 깊이가 0 또는 1개 있습니다 PATTERN
. 블록이 여러 개인 경우 필요에 맞게 확장하면 됩니다.
산출:
m m1 {
s s1;
s s2;
c c1 {
s s3;
}
}