특정 줄의 vim에서 검색 및 바꾸기


97

나는 사용할 수있다

:5,12s/foo/bar/g

5 번과 12 번 줄 사이 에서 검색 foo하고 바꾸 bar려면 어떻게해야합니까?

답변:


77

Vim에는 특정 행, 열 등에서 일치하는 특수 정규식 원자가 있습니다. 범위에 추가하여 사용할 수 있습니다.

:5,12s/\(\%5l\|\%12l\)foo/bar/g

보다 :help /\%l


8
예상했던 것보다 더 복잡한 방법이지만 내 질문에 완벽하게 대답합니다. 감사!
pfnuesel 2013 년

56

5 행에서 대체를 수행하고 12 행에서 최소한의 노력으로 반복 할 수 있습니다.

:5s/foo/bar
:12&

Ingo가 지적했듯이, :&깃발을 잊어 버립니다. 을 사용 /g하고 있으므로 올바른 명령은 다음과 :&&같습니다.

:5s/foo/bar/g
:12&&

보고 :help :&친구.


10
애매한 :&사용을 위한 +1 . 플래그 (있는 경우 s/../../g), 하나는 사용하는 :&&...하지만,
잉고 Karkat

10
@IngoKarkat는 박람회로, 내 생각은 \(\%5l\|\%12l\)보다 더 불분명:&
doubleDown

13

항상 c끝에 a 를 추가 할 수 있습니다 . 이것은 매 경기마다 확인을 요청합니다.

:5,12s/foo/bar/gc

1
라인 5와 12 사이에 많은 경기가있는 경우 악몽이 될 수 있습니다 ( g플래그가 진행
중임을 명심하십시오

1
@doubleDown 이것은 보편적 인 해결책을 의미하지는 않지만 (가능한 많은 후보가있는 곳에서), 대부분의 경우에 당신은 정말로 n5 ~ 6 번 누르는 것이 \(\%5l\|\%12l\)대체 문에 추가 하는 것보다 더 번거 롭 습니까?
Dean

나는 이것이 유용하다고 생각하고 다른 모든 줄을 바꾸고 싶었습니다. 이것은 내가 한 것보다 더 빠를 것입니다.
tiktak

9

흥미로운 질문입니다. 범위 선택 만 있고 여러 줄 선택이없는 것 같습니다.

http://vim.wikia.com/wiki/Ranges

그러나 5 번과 12 번 줄에 특별한 내용이있는 경우 :g연산자를 사용할 수 있습니다 . 파일이 다음과 같은 경우 (참조 용 번호) :

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

그리고 당신은 대체 할 oneeno거기 라인에 enil대신 line:

:g/enil/s/one/eno/

5
이것은 실제로 가정되어 많은
doubleDown

1

edvi 및 vim과 유사한 명령을 사용 하는 행 지향 텍스트 편집기를 사용할 수 있습니다 . 아마도 vi와 vim보다 앞선 것입니다.

스크립트 (EndCommand 마커까지 입력을 처리하는 here 문서 사용)에서는 다음과 같습니다.

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

분명히 ed 명령은 명령 줄에서도 사용할 수 있습니다.


3
나는 vim대안에 비해 이점이 없다고 생각합니다 .
Bernhard

1
Vim에서도 마찬가지입니다. 숫자는 실제로 앞에 놓을 수 :s있지만 여전히 :s명령 의 중복이 있습니다 (romainl의 솔루션이 피함).
Ingo Karkat 2013-06-26

내 견해는 사용자가 편집을 위해 두 줄 이상을 선택하기를 원할 수 있다는 것입니다. 이 경우 비대화 형 접근 방식이 중요 할 수 있습니다. AFAIK는 vim으로 수행 할 수 없습니다.
suspectus

1
오, Vim은 그렇게 할 수 있지만 (예 : "Ex"모드에서) 인터랙티브 편집기보다 다른 도구를 선호하는 것이 맞습니다. 내 선호 될 것이다 sed...하지만,
잉고 Karkat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.