Vim:s는 한 줄에서 처음 N < g 항목을 대체합니다.

Vim:s는 한 줄에서 처음 N < g 항목을 대체합니다.

vim에서는 때때로 한 줄에서 일치하는 항목의 처음 몇 개를 교체하지만 모든 사람이 그것을 좋아하는 것은 아닙니다 g. 예를 들어:

a a a a a

도착하다

b b b a a

나는 그것을 사용할 수 있다는 것을 알고 있지만 :s/a/b/[enter]:[up][enter]:[up][enter]그것을 3번 반복하는 것은 충분히 지루하며 내 행에 10개 이상의 교체가 있을 수 있습니다.
나는 시도했다:

  • :s/a/b/3g: vim은 후행 문자에 대해 불평합니다.
  • :s/a/b/3: 이 줄과 다음 두 줄의 첫 번째 항목을 변경합니다.
  • 3:s/a/b: 기존과 동일합니다.
  • :s/a/b/g3: 이 줄과 다음 두 줄에 나타나는 모든 내용을 변경합니다.
  • :3s/a/b: 3행의 첫 번째 항목을 변경합니다.
  • :/a/,3/a/s/a/b: 파일에 포함된 다음 줄과 세 번째 줄 a사이의 각 줄의 첫 번째 발생을 변경합니다(필요한 경우 프롬프트를 반전).a
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/: 이 줄과 3개를 포함하는 다음 줄 사이의 각 줄의 첫 번째 발생을 변경합니다 a(그리고 이는 다중 문자 검색으로 쉽게 확장되지 않습니다).

다른 다양한 주소 지정 모드가 있지만 작동하지 않습니다. :s이 질문에 대한 답을 찾으려고 이 명령에 대해 꽤 많이 배웠지만 아직 해결하지 못했다고 말씀드리고 싶습니다 .

이 작업을 수행하는 방법을 아는 사람이 있나요?

(두 번째에서 네 번째 발생과 같은 특정 범위에 대한 보너스 포인트)

답변1

확립된:s/pattern/replacement/gc 사무스의 생각_(대체 문자열에 패턴이 포함되어 있을 때 올바른 작동을 보장하는 가장 쉬운 방법인 것 같습니다.) 두 번째부터 네 번째 항목까지 한 줄로 바꿉니다.

:call feedkeys("nyyyq") | s/pat/string/gc

feedkeys()입력 문자열을 키보드 입력 큐에 채우는 함수입니다. 중요한 것은 계산을 미리 하여 잘못 기억하거나 방해받을 염려가 없도록 하는 것입니다.

보다 일반적인 경우에는통과하다N번째한 줄에 나타나는 횟수는 다음과 같습니다.질소매우 큰 것보다 크거나 같음중간 사이즈:

:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc

바꾸다중간 사이즈그리고질소원하는 값으로 계산합니다( vim직접 수행하고 싶지 않다면 간단한 암산을 직접 수행할 수도 있습니다). 이는 .VimL의 문자열 연결 연산자입니다. 분명히 이것은 많은 수의 키 입력만을 저장합니다.중간 사이즈. 이 기능을 자주 사용하는 경우 위의 내용을 사용자 정의 명령이나 일부 유형의 함수에 넣으면 입력할 내용이 상당히 많기 때문에 시간을 절약할 수 있습니다.

답변2

첫 번째 질문에 대해 나는 이렇게 할 것이다:

:s/a/b
&&

두 번째는 더 까다롭고 이를 자동화하는 방법은 모르지만 다음과 같이 각 일치 항목에서 vim이 메시지를 표시하도록 할 수 있습니다.

:s/a/b/gc

그런 다음 처음 n개 일치 항목에 대해 "아니요"라고 대답하고 나머지 항목에는 "예"라고 대답합니다.

답변3

a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

:3,6g/^/let i=0 | while i<3 | s/a/b/ | let i+=1 | endwhile

a a a a a
a a a a a
b b b a a
b b b a a
b b b a a
b b b a a
a a a a a

답변4

나는 이것이 효과가 있을 것이라고 생각하고 먼저 교체한 다음 두 번 반복합니다.

:s/a/b/
2@:

관련 정보