아래와 같은 파일이 있습니다
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/
일치시킵니다 . 이 모든 행을 "예약된 공간"에 넣으세요 .Event1
Event2
H
- 2부:
/Event2/{x;/B/p}
줄에 가 포함되어 있으면Event2
명령 그룹을 실행합니다{x;/B/p}
. - 명령 그룹에는
x
및 의 두 부분도 있습니다/B/p
. x
"예약된 공간"에 있는 모든 것을 "패턴 공간"에 넣습니다./B/p
B
가 있는 경우 패턴 공간을 인쇄합니다.
인간 언어의 개념은 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