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@: