sed, awk 또는 grep을 사용한 여러 줄 패턴 일치

sed, awk 또는 grep을 사용한 여러 줄 패턴 일치

sed을 사용 하거나 awk여러 줄 패턴 일치를 수행 할 수 있습니까 grep? 예를 들어, {와 사이의 모든 줄을 가져오고 싶습니다 .}

그러니까 일치해야지

 1. {}
 2. {.....}
 3. {.....
.....}

원래 이 질문은 <p>예시로 사용되었습니다. {및 를 사용하도록 질문을 편집했습니다 }.

답변1

나는 작거나 완전히 임시적인 것보다 작은 것을 처리할 수 있는 파서를 얻고 싶다는 위의 제안에 동의하지만 sed를 사용하여 중괄호 사이의 여러 줄 블록을 일치시키는 것이 (거의 ;-) 가능합니다.

이것은 sed 코드의 디버그 버전입니다.

sed -n '/[{]/,/[}]/{
    p
    /[}]/a\
     end of block matching brace

    }' *.txt

몇 가지 메모,

  • -n은 "기본 인쇄 라인 없이 처리"를 의미합니다.
  • 'p'는 의미한다지금이 줄을 인쇄하세요.
  • 이 구문은 /[{]/,/[}]/범위 표현식입니다. 이는 첫 번째 패턴과 일치하는 항목을 찾을 때까지 스캔한 (/[{]/)다음 두 번째 패턴을 찾을 때까지 스캔한 (/[}]/)다음 sed 코드의 { } 사이에 있는 모든 작업을 수행하는 것을 의미합니다. 이 경우에는 "p"와 디버그 코드입니다. (여기에서는 설명하지 않았지만, 사용하거나 수정하거나 제거하는 방법 중 가장 적합한 방법을 선택하세요.)

코드가 {,}로 구분된 블록과 일치한다고 판단되면 블록 디버그의 /[}]/a\ 끝 부분을 제거할 수 있습니다.

이 코드 예제에서는 중괄호 쌍 안에 있지 않은 모든 항목을 건너뜁니다. 위에서 다른 사람들이 지적했듯이 문자열, 정규 표현식 등에 추가 {,}를 포함하면 쉽게 혼란스러울 수 있습니다.OR 같은 줄에 닫는 중괄호, (Fred.bear에게 감사드립니다)

이게 도움이 되길 바란다.

답변2

pcregrep에 -M(여러 줄) 옵션을 사용할 수 있습니다.

pcregrep -M '\{(\s*.*\s*)*\}' test.txt

\s는 공백(개행 문자 포함)이므로 0개 이상의 (공백 뒤에 .* 뒤에 공백이 오는) 항목과 일치하며 모두 중괄호로 묶입니다.

고쳐 쓰다:

탐욕스럽지 않은 일치가 이루어져야 합니다.

pcregrep -n -M '\{(\n*.*?\n*)*?\}' test.txt

답변3

XML과 유사한 표현식(무한 재귀 태그)은 "일반 언어"가 아니므로 정규 표현식(regex)을 사용하여 구문 분석할 수 없습니다. 이유는 다음과 같습니다.

https://stackoverflow.com/questions/1732348/regex-match-open-tags-book-xhtml-self-contained-tags/

http://www.perlmonks.org/?node_id=668353

https://stackoverflow.com/questions/1379524/textual-protocol-which-is-not-a-regular-언어

답변4

정규식은 일치하는 중첩 괄호를 찾을 수 없습니다.

검색 중인 대괄호에 대괄호 쌍이 중첩되어 있지 않다고 확신하는 경우 첫 번째 닫는 대괄호까지 검색할 수 있습니다. 예를 들어:

sed -r 's#\{([^}])\}#\1#'

이렇게 하면 "{"와 "}" 사이의 모든 텍스트가 그 사이의 내용으로 대체됩니다.

관련 정보