패턴 매칭과 함께 grep

패턴 매칭과 함께 grep

아래와 같은 파일이 있습니다

Event1
A
B
C
Event2
CC
CC
DD
Event1
E
N
D
Event2 

이제 이벤트 1과 이벤트 2 사이를 sed할 수 있고 그 사이의 모든 줄을 가져올 수 있지만, 내가 원하는 것은 이벤트 1과 이벤트 2 사이의 줄에 출력할 내용으로 "B"가 있는 경우에만 sed하는 것입니다. 그래서 내 출력은 다음과 같습니다

Event1
A
B
C
Event2

답변1

sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' filename

설명하다:

  • sed 프로그램은 /Event1/,/Event2/H과 의 두 부분으로 구성됩니다 /Event2/{x;/B/p}.
  • 1부: 와 ​​사이의 모든 줄을 /Event1/,/Event2/일치시킵니다 . 이 모든 행을 "예약된 공간"에 넣으세요 .Event1Event2H
  • 2부: /Event2/{x;/B/p}줄에 가 포함되어 있으면 Event2명령 그룹을 실행합니다 {x;/B/p}.
  • 명령 그룹에는 x및 의 두 부분도 있습니다 /B/p.
  • x"예약된 공간"에 있는 모든 것을 "패턴 공간"에 넣습니다.
  • /B/pB가 있는 경우 패턴 공간을 인쇄합니다.

인간 언어의 개념은 Event1과 사이의 모든 줄을 적는 것입니다 Event2. 이 내용이 보이면 Event2방금 알아차린 모든 줄을 살펴보세요. 있으면 B인쇄하십시오 . 그렇지 않으면 무시됩니다.


위의 sed 프로그램에는 "버그"가 있습니다.

입력이 다음과 같은 경우:

Event1x
A
B
C
Event2x
CC
CC
DD
Event1y
E
N
D
Event2y
CC
CC
DD
Event1z
X
B
X
Event2z

출력은 다음과 같습니다.

$ sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' foo

Event1x
A
B
C
Event2x
Event2y
Event1z
X
B
X
Event2z

Event2y첫 번째 빈 줄을 참고하세요 . 이는 sed의 특성 때문입니다.

sed 프로그램을 수정하면 Event2y빈 줄이 대체됩니다. 이는 기본적으로 첫 번째 빈 줄과 동일한 이유입니다.

sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename

출력 예

$ sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename

Event1x
A
B
C
Event2x

Event1z
X
B
X
Event2z

빈 줄은 sed-fu를 더 많이 사용하여 수정할 수 있지만 이를 수정하려면 평판 포인트가 더 필요합니다.


sed에 대해 자세히 알아보세요!!1

관련 정보