다음 로그가 있습니다.
2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
이 줄을 삭제하고 싶지만 ApplicationState
이 줄 끝에 패턴이 없습니다 Blah Blah Blah
.
제가 제거하고 싶은 블록은 다음과 같습니다:
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
다음 요청이 시작되기 전에.
답변1
일치 항목 앞에 나타나는 줄을 포함하여 1부터 시작하는 줄의 전체 블록을 다음 줄이 나타날 때까지 제거하려면 [T1114Base
다음을 수행할 수 있습니다.
sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out
이것이 어떻게 작동하는지 이해하는 것은 매우 간단합니다. 기본적으로 sed
입력은 한 번에 한 줄씩 먹습니다. 하지만 더 넓은 관점을 원한다면 스크립트를 작성하면 됩니다.
!
따라서 각 입력 라인에 대해 현재 라인이 마지막 라인 이 아닌 경우 삽입된 줄 바꿈 문자로 구분된 패턴 공간 에 $
추가 라인이 추가됩니다 .sed
N
\n
범위 표현식에서 먼저 일치하는 항목을 찾습니다.ApplicationState
그 뒤에는 *
임의 개수의 .
문자가 오고 그 뒤에는 적어도 하나의 \n
줄줄이 옵니다. 범위 표현식을 끝내려면 $!N
우선 목적인 입력을 살펴봐야 합니다 . sed
다음 행 발생을 스캔합니다.뒤쪽에마지막으로 삭제할 항목입니다. \n
다음 입력 블록의 시작 부분과 일치해야 하는 패턴이 뒤따르는 ewline을 찾습니다 .
범위 표현식이 !
일치하지 않으면 패턴 공간에서 첫 번째 개행 문자가 인쇄 sed
되고 , 일치 여부와 상관없이 패턴 공간에서 첫 번째 개행 항목이 제거 되고 다음 과 같이 스크립트의 맨 위로 재활용됩니다. 나머지 .P
\n
sed
D
기본적 sed
으로 입력된 2줄을 동시에 스와이프하면 P
삭제 블록에 나타나지 않는 경우 가장 오래된 줄이 인쇄될 수 있으며 D
확장을 추가하기 전에 항상 가장 오래된 줄만 삭제합니다 N
.
답변2
정말 시도해 보셨나요?
전체 행을 삭제한다고 가정해 보겠습니다.
sed '/ApplicationState/d' inputfile