sed에서 일치하는 줄 전후의 n 줄 범위를 삭제하시겠습니까?

sed에서 일치하는 줄 전후의 n 줄 범위를 삭제하시겠습니까?

vim에서는 사용할 수 있습니다 ...

:g/match/-1d

...일치 전에 여러 줄을 여러 번 삭제합니다...

...그리고 이를 몇 가지 호출과 결합합니다...

:g/match/+1d

...경기가 끝난 후 여러 줄을 삭제합니다...

:g/match/-1d,+1d

...이전, 이후 및 현재 행 삭제...

sed도 같은 일을 할 수 있나요?

답변1

sed를 요청했지만 ed다음과 같이 할 수도 있습니다.

$ seq 10 > input
$ ed -s input <<< '/5/ -2, /5/ +2 d'$'\n'w
$ cat input
1
2
8
9
10

이는 ed에게 s두 가지 명령을 사용하여 파일을 자동으로 편집하도록 지시합니다.input

  1. regex 와 일치하는 줄에서 시작하여 5두 줄을 빼고 regex 와 일치하는 줄에서 끝나고 5두 줄을 추가하고 d범위를 삭제합니다 .

(ANSI 이스케이프된 개행 문자로 구분됨 $'\n')

  1. w파일을 디스크에 다시 쓰기

답변2

영역이 겹치지 않으면 다음을 사용할 수 있습니다.

sed -zE 's/([^\n]*\n){2}([^\n]*match[^\n]*)(\n[^\n]*){3}/\2/g'

GNU를 사용하여 sed일치 항목 앞의 두 줄과 뒤의 세 줄(의 값 {})을 삭제합니다.

일반적인 sed구현의 경우 옵션이 없으므로 -z버퍼의 행을 수집하는 구성표를 사용해야 하며 H;1h;$!d"개행 문자를 제외한 모든 작업"을 사용할 수 없으므로 [^\n]다음과 같은 해결 방법이 필요합니다.

sed -E 'H;1h;$!d;x;y/\n#/#\n/;s/([^#]*#){2}([^#]*match[^#]*)(#[^#]*){3}/\2/g;y/\n#/#\n/'

두 솔루션 모두 패턴 공간의 전체 파일에 대해 작동하므로 대용량 파일에는 사용하지 마십시오.

관련 정보