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#'
이렇게 하면 "{"와 "}" 사이의 모든 텍스트가 그 사이의 내용으로 대체됩니다.