program story

Vim : 두 번째 행마다 삭제하는 방법?

inputbox 2020. 9. 4. 07:23
반응형

Vim : 두 번째 행마다 삭제하는 방법?


Vim에서 수행하는 방법 :

전에:

aaa
bbb
ccc
ddd
eee
fff

후:

aaa
ccc
eee

이를 위해 매크로를 사용할 수 있습니다. 다음을 수행하십시오.

  • 명령 모드에서 시작합니다.
  • 를 눌러 파일의 시작 부분으로 이동합니다 gg.
  • 를 누릅니다 qq.
  • 아래쪽 화살표를 클릭하고 dd뒤를 누릅니다 .
  • 를 누릅니다 q.
  • 프레스 10000@q

추신 : 명령 모드로 이동하려면 Escape를 몇 번 누르십시오.


작업을 수행하는 우아하고 효율적인 방법은 :+delete명령을 사용하는 모든 줄에서 현재 줄 옆에있는 줄을 제거하는 :global명령을 실행하는 것입니다.

:g/^/+d

주어진 일반 모드 명령을 사용 :normal하거나 :norm실행할 수 있습니다 . 출처.

:%norm jdd

:map ^o ddj^o
^o

여기서 ^는 CTRL을 의미합니다. 두 줄마다 한 줄씩 삭제하는 순환 매크로입니다. 첫 번째 줄을 잘 선택하면 완료됩니다.


에서 VIM 메일 아카이브 :

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(vim 명령 줄에서 한 줄에 입력하려면 1,3,5,7, ... 행을 삭제합니다.)


쉘 명령을 통해 항상 파이프 할 수 있습니다. 즉, 원하는 스크립팅 언어를 사용할 수 있습니다.

:%!perl -nle 'print if $. % 2'

(또는 원하는 줄에 따라 "if"대신 "unless"사용)


:%!awk -- '++c\%2'

대안으로

:%!awk -- 'c++\%2'

제거하려는 절반에 따라 다릅니다.


다음과 같이 Vim의 자체 검색 및 대체 기능을 사용할 수 있습니다. 커서를 첫 번째 줄에 놓고 일반 모드로 입력합니다.

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • .,/fff/대체의 범위이다. "이 줄에서 정규식과 일치하는 줄 fff(이 경우 마지막 줄) 까지"을 의미 합니다.
  • s///대체 명령입니다. 정규식을 찾고 모든 항목을 문자열로 바꿉니다. g단부 수단으로는 긴 정규식 발견되는 유지로 교체를 반복한다.
  • 정규식 \n.*\(\n.*\)은 줄 바꿈, 전체 줄 ( .*줄 바꿈을 제외한 모든 문자와 일치), 다른 줄 바꿈 및 다른 줄과 일치합니다. 괄호 \(그 안의 \)표현식이 기록되도록하므로 나중에 \1.
  • \1 그룹화 된 줄 바꿈과 그 뒤에 줄을 삽입합니다. 왜냐하면 다음 줄도 사라지는 것을 원하지 않기 때문입니다. 우리는 대체 메커니즘이지나 가기를 원하므로 다음 대체에서 삭제하지 않습니다.

이렇게하면 삭제를 수행 할 범위를 제어 할 수 있으며 외부 도구를 사용할 필요가 없습니다.


또 다른 접근 방식으로 vim이 지원하는 경우 파이썬을 사용할 수도 있습니다.

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:] temporarily copies all lines in the current buffer to b. b[::2] gets every second line from the buffer and assigns it to the whole current buffer cb[:]. The copy to b is necessary since buffer objects don't seem to support extended slice syntax.

This is probably not the "vim way", but could be easier to remember if you know python.


To delete odd lines (1,3,5,..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g

To delete even lines(2,4,6,..) -> :%s/\(.*\)\n.*\n/\1\r/g

Search for text (forms the first line) followed by a new line character and some more text (forms the second line) followed by another new line character and replace the above with either first match (odd line) or second match (even line) followed by carriage return.


you can try this in vim

:2,$-1g/^/+1d

참고URL : https://stackoverflow.com/questions/1946738/vim-how-to-delete-every-second-row

반응형