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
- regex 와 일치하는 줄에서 시작하여
5
두 줄을 빼고 regex 와 일치하는 줄에서 끝나고5
두 줄을 추가하고d
범위를 삭제합니다 .
(ANSI 이스케이프된 개행 문자로 구분됨 $'\n'
)
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/'
두 솔루션 모두 패턴 공간의 전체 파일에 대해 작동하므로 대용량 파일에는 사용하지 마십시오.