sed regex를 vim regex로 변환

Sep 09 2020

이 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과 호환되는 정규식으로 변환하는 것입니다. 내가 사용하고 이 사이트의 경우 정력 정규식에 위를 변환 시작 나는 확실 해요, 도움과 지역 매뉴얼을하지만.

답변

2 D.BenKnoble Sep 10 2020 at 03:16

훨씬 더 관용적으로 작업을 수행하는 매우 간단한 함수 :

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)다음 시작점을 찾은 다음 +중첩 된 영역 내부에있는 데 사용합니다. 그런 다음 함수를 호출합니다. 이것은 모든 라인에서 함수를 호출하는 것보다 빠릅니다.

3 Quasímodo Sep 10 2020 at 04:17
: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글로벌 명령한다.

3 D.BenKnoble Sep 10 2020 at 06:31

재미로, 항상 할 수 있다는 것을 기억하세요

:%!sed '/start/\!d;s//&\n/;s/.*\n//;:a;/end/bb;$\!{n;ba};:b;s//\n&/;P;D'

그리고 그것은 여전히 ​​"vim"입니다. : P