
요청과 일치하는 마지막 2줄만 출력하는 정규식을 만들려고 합니다. 몇 줄이 포함된 로그 파일이 있는데 다음을 사용하여 마지막 2줄을 확인하고 싶습니다.
첫 번째 줄: "4bccf" 및 "Media"
두 번째 줄 : "Live" 및 "4bccf" 및 "my"
나는 그것에 대해 하나의 정규식을 만들었습니다.
((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))
작동하지만 ("4bccf" 및 "Media")가 포함된 모든 줄 + ("Live" 및 "4bccf" 및 "my")가 포함된 모든 줄이 인쇄됩니다.
나는 각각의 마지막 줄만 얻고 싶습니다. 하나의 정규식에서만 그렇게 할 수 있습니까?
아이디어가 있다면 매우 관심이 있습니다. 감사합니다.
답변1
다음은 작업을 수행하는 복잡한 정규식(PCRE 버전)이지만, 선호하는 스크립트 언어로 스크립트를 작성하는 것이 좋습니다. 훨씬 더 유지 관리가 용이해질 것입니다!
메모:/x
나는 주석을 허용하고 공백을 처리하지 않는 플래그를 사용했습니다 . 이는 가독성에 매우 유용합니다 ;-). 정규식 버전이 이를 지원하지 않는 경우 공백과 줄바꿈을 모두 제거하세요.
^ # beginning of line
(?=.*\b4bccf\b) # lookahead, make sure we have 4bccf in the line
(?=.*\bMedia\b) # lookahead, make sure we have Media in the line
(.+) # group 1, the whole line
$ # end of line
(?= # lookahead, make sure we have after:
(?: # non capture group
(?! # negative lookahead, make we haven't after:
(?=.*\b4bccf\b) # lookahead, make sure we have 4bccf in the line
(?=.*\bMedia\b) # lookahead, make sure we have Media in the line
) # end lookahead
[\s\S] # any character, including linebreak
)* # end group, may appear 0 or more times
\z # end of file
) # end lookahead
| # OR
^ # same description as above for the other words to check
(?=.*\bLive\b)
(?=.*\b4bccf\b)
(?=.*\bmy\b)
(.+)
$
(?=
(?:
(?!
(?=.*\bLive\b)
(?=.*\b4bccf\b)
(?=.*\bmy\b)
)
[\s\S]
)*
\z
)