패턴이 발견되면 중괄호 블록을 제거하세요.

패턴이 발견되면 중괄호 블록을 제거하세요.

{}블록 내부에서 패턴이 발견되면 중괄호 블록 + "이름"(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;   
    }  
}

관련 정보