sed regex를 vim regex로 변환
이 sed 정규식을 찾았습니다.
sed '/start/!d;s//&\n/;s/.*\n//;:a;/end/bb;$!{n;ba};:b;s//\n&/;P;D'
기본적으로 시작점과 끝점 사이에있는 콘텐츠를 출력합니다.
##1##
this is a test
with multiple
line
##z##
및 교체 start와 함께 ##1##, 그리고 end에이 ##z##줄 것이다 :
this is a test
with multiple
line
##1##and 가 여러 번 발생하면 다음 과 같이 해당 발생의 ##z##모든 중간 텍스트가 분명히 표시됩니다.
##1##
this is a test
with multiple
line
##z##
##1##
this is a test
with multiple
line
##z##
...에
this is a test
with multiple
line
this is a test
with multiple
line
더 명확히하려면 :
##1##
this is a test
with multiple
line
##z##
##2##
test
##z##
분명히 시작점으로 지정된 것만 제공합니다 (종료 점이 ##z##항상 동일하기 때문에). 따라서 ##2##대신 시작점으로 사용 하는 경우 :
test
이것은 위의 출력을 제공합니다.
내 목표는 이것을 vim과 호환되는 정규식으로 변환하는 것입니다. 내가 사용하고 이 사이트의 경우 정력 정규식에 위를 변환 시작 나는 확실 해요, 도움과 지역 매뉴얼을하지만.
답변
훨씬 더 관용적으로 작업을 수행하는 매우 간단한 함수 :
function! Between(start, end) abort
let [start_line, _] = searchpairpos(a:start, '', a:end, 'bWn')
let [end_line, _] = searchpairpos(a:start, '', a:end, 'Wn')
if start_line is# 0 || end_line is# 0
return
endif
call setline(start_line, '') " or: execute start_line 'delete'
call setline(end_line, '') " or: execute end_line 'delete'
endfunction
원하는대로 이름을 지정한 다음 예를 들어
call Between('##1##', '##z##')
(아마도 키에 바인딩 할 수 있습니다).
전체 파일에 대해 작업 하려면를 사용할 수 있습니다 :global(또는 그냥 :%call Between(...)) 또는이 함수를 래핑하고 파일을 순회하는 루프가 필요할 수 있습니다. 후자의 경우 search(a:start)다음 시작점을 찾은 다음 +중첩 된 영역 내부에있는 데 사용합니다. 그런 다음 함수를 호출합니다. 이것은 모든 라인에서 함수를 호출하는 것보다 빠릅니다.
:g/END\|\%^/,/START\|\%$/s/.*//
이 전역 명령은 일치하는 모든 줄 END또는 파일 ( \%^) 의 시작을 표시합니다 . 그런 다음 대체 명령을 사용하여 표시된 줄 START에서 파일 ( \%$) 까지의 모든 항목을 삭제 s/.*//합니다.
나란히있는 예 :
Before |After
________________________________
test |
START |
this is a test |this is a test
with multiple |with multiple
line |line
END |
0 |
START |
0101 |0101
END |
11 |
111 |
당신은 빈 줄을 원하지 않는 경우, 당신은 대체 할 수 있습니다 s/.*//에 의해 d글로벌 명령한다.
재미로, 항상 할 수 있다는 것을 기억하세요
:%!sed '/start/\!d;s//&\n/;s/.*\n//;:a;/end/bb;$\!{n;ba};:b;s//\n&/;P;D'
그리고 그것은 여전히 "vim"입니다. : P