두 개의 반복되는 텍스트 패턴 사이에 있는 모든 텍스트 또는 문자를 선택하세요.

두 개의 반복되는 텍스트 패턴 사이에 있는 모든 텍스트 또는 문자를 선택하세요.

다음은 샘플 .log 파일입니다(더 많은 줄이 있을 수 있음).

2022 User abc (iii)
2023 defaa <party> ttt
2222221 User def (bbb)
20222 defaa <accoun> ttt
2222 User dddd (aaa)
3333 defaa <hahaha> jmd

User& 사이의 행을 선택하고 싶습니다 .ttt

이는 로그의 5~7행과 유사하며, 이 로그에는 User&로 구성된 행이 더 있을 수 있습니다.ttt

Userttt그래서 파일에서 반복되더라도 & 사이의 모든 줄을 가져오는 방법을 알고 싶습니다.

텍스트 Userttt항상 연속된 줄에 있는 것은 아님

예상 출력:

abc (iii)
2023 defaa <party> 
def (bbb)
20222 defaa <accoun> 

중첩된 경우 다음과 같습니다.

2022 User abc (iii)
2222221 User def (bbb)
20222 defaa <accoun> ttt
2023 defaa <party> ttt

예상 출력:

def (bbb)
20222 defaa <accoun>

사용자와 ttt는 결코 같은 줄에 있지 않습니다

답변1

multi-character 에 대한 GNU awk의 약어를 사용하면 원하는 것일 수 있습니다 RS.RT\s[:space:]

$ awk -v RS='\\s*ttt' 'RT && sub(/.*User\s*/,"")' file
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>

부분 일치를 허용하지 않으려면 User주위 ttt에 단어 경계를 추가하십시오.

awk -v RS='\\s*\\<ttt\\>' 'RT && sub(/.*\<User\>\s*/,"")' file

답변2

를 사용하면 sed주소 범위를 선택 User하고 ttt이를 예약된 공간에 수집할 수 있습니다.

sed '/User/,/ttt/!d;H;/User/h;/ttt/!d;x;s/.*User //;s/ttt.*//' yourfile

상해:

  • /User/,/ttt/User다음 범위까지 행을 선택합니다 ttt(중첩된 경우에 필요한 대로). 선택 항목이 반전 !되어 d제거됩니다. 따라서 이 단계에서는 해당 범위 밖의 모든 행을 삭제합니다. 안타깝게도 User파일 끝부터 끝까지 마지막 단락은 다음과 같습니다.아니요제거되었으므로 이를 제거할 방법이 필요합니다.
  • H예약된 공간에 모든 행을 추가하는 동안/User/h 복사행을 User예약된 공간에 추가하므로 예약된 공간에는 User현재 행까지의 모든 행이 포함됩니다. 이런 식으로 새 User행은 예상대로 중첩으로 이전의 모든 것을 덮어씁니다.
  • /ttt/!d가 없는 모든 행에서 실행을 중지하므로 저장 공간에 ttt`의 모든 내용을 ttt수집할 때까지 출력이 생성되지 않습니다 .User' to
  • 하지만 일단 모든 것을 다 모은 후에는 x버퍼를 변경하여 패턴 공간의 예약된 공간에서 해당 라인을 가져올 수 있습니다.
  • 그럼 User다 삭제해s/.*User //
  • ttt다음으로 시작하는 모든 항목을 삭제합니다 .s/ttt.*//

관련 정보