일치하는 줄 바로 뒤에있는 줄을 제거해야하는 경우 sed
프로그램은 연속적인 일치를 고려해야합니다. 다시 말해, 일치하는 행 다음에있는 행을 제거하면 그 뒤에 나오는 행도 제거해야합니다.
그것은 충분히 충분히 구현되었지만 약간 뒤 쳐야합니다.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
읽은 각 줄에 대해 보류 및 패턴 공간을 교환하여 작동하므로 매번 마지막 줄을 현재와 비교할 수 있습니다. 따라서 sed
줄을 읽을 때 버퍼의 내용을 교환합니다. 이전 줄은 편집 버퍼의 내용이며 현재 줄은 보류 공간에 있습니다.
따라서 sed
이전 행과 일치 match
하는지 확인하고 !
찾지 못하면 {
함수 의 두 표현식 }
이 실행됩니다. sed
것 g
등 패턴 영역 덮어 쓰기로 보류 공간 - 그것은 것이다 - 그리고 현재의 라인 홀드 패턴 공간 모두에서 다음을 의미 //
가장 최근에 컴파일 된 정규 표현식에 일치 여부를 확인한를 - match
- 그리고 경우는 그것을 하지 않습니다 match
그것은 있다 p
rinted.
이것은하지 않는 경우 선은 인쇄 의미 와 바로 이전 행은하지 않습니다 . 또한 일련의 es에 대한 불필요한 스왑을 포기합니다 .match
match
match
이후에 발생하는 임의의 수의 줄을 삭제할 수있는 버전을 원한다면 match
조금 더 많은 작업이 필요합니다.
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... 5 를 제거하려는 줄 수 (일치하는 줄 포함) 로 바꿉니다.
1
2
3
4
12
13
14
21