여러 줄의 vim에서 문자열 찾기 및 바꾸기


352

내가 할 수있는 :%s/<search_string>/<replace_string>/g파일을 통해 문자열을 교체하기위한, 또는 :s/<search_string>/<replace_string>/현재 행에서 대체 할 수 있습니다.

vim에서 선택 줄에서 단어를 선택하고 바꾸려면 어떻게해야합니까?

예 : 라인에서 텍스트를 교체 6-10, 14-18하지만에서 11-13.



답변:


254

:&&명령은 같은 플래그 지난 대체를 반복합니다. 추가 범위를 제공하고 원하는만큼 연결할 수 있습니다.

:6,10s/<search_string>/<replace_string>/g | 14,18&&

그래도 많은 범위 가 있다면 루프를 사용하는 것이 좋습니다.

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor

5
감사. 미래의 사용자를위한 참고 사항- :6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&또한 작동하며 for루프를 사용하면 기억하고 실행하기가 더 쉽습니다.
mu 無

5
당신이 그것을 좋아해서 다행입니다! :당신이 좀 더 키 입력을 저장할 수 있도록 후속 명령에는, BTW, 선택 사항입니다.
Ingo Karkat

2
:&&일주일에 수백 건의 키 스트로크를 절약 할 수 있습니다. 감사!
pdoherty926

그것은 내 vim의 끝에 'g'없이 작동합니다. 라인 범위를 지정할 때 글로벌 플래그가 필요하지 않습니다.
Tayyar R

3
@TayyarR 범위는 라인을 가리고 (수직으로 말하면) 'g'플래그는 라인 내에서 일치하는 하나만 (가로) 대체되는지 여부를 결정합니다.
Ingo Karkat

385

전부 교체:

:%s/foo/bar/g

각 줄에서 'foo'를 찾아서 'bar'로 바꿉니다.

특정 라인의 경우 :

:6,10s/foo/bar/g

6 행에서 10 행까지의 모든 행에 대해 각 'foo'를 'bar'로 변경하십시오.


3
/ g의 목적은 무엇입니까? 죄송하지만 지금은 리눅스에 새로 온
라자 Anbazhagan

4
@RajaAnbazhagan이 표현식의 마지막 부분은 마지막 뒤에 /작업에 대한 플래그를 나타내는 위치입니다. 이 명령은 일반적으로 줄 의 첫 번째 일치 항목을 대체합니다 . g플래그를 사용하면 모든 발생을 대체합니다.
Litty

17
다른 사람의 작업을 복사하여 지나치려면 소스 (vim.wikia.com/wiki/Search_and_replace)를 참조해야합니다.
앤드류 S

2
%것은 작업을 수행합니다! 그렇지 않으면, 그것은 단지 첫 번째 사건 일뿐입니다.
Santosh Kumar

7
%=> 모든 줄에서이 명령을 실행하십시오. g=> 같은 줄에서 여러 번 발생합니다.
Shaahiin

55

참고로, 줄 번호를 입력하지 않고 시각적 모드 중 하나에서 찾거나 바꿀 줄을 강조 표시하십시오.

  • VISUAL모드 ( V)
  • VISUAL BLOCK모드 ( Ctrl+ V)
  • VISUAL LINE모드 ( Shift+ V, 귀하의 경우 가장 잘 작동합니다)

바꿀 줄을 선택했으면 다음 명령을 입력하십시오.

:s/<search_string>/<replace_string>/g

범위 '<,'>가 자동으로 삽입됩니다.

:'<,'>s/<search_string>/<replace_string>/g

여기서는 '<단순히 강조 표시된 첫 번째 줄'>의미하고 마지막 강조 표시된 줄을 의미 합니다 .

참고 행동이 예기치 될 수 있음을 때의 NORMAL모드 : '<'>시작과 중 하나를 수행 마지막 하이라이트의 끝 지점 VISUAL모드. 대신 NORMAL모드에서 특수 행 번호를 .사용할 수 있습니다. 이는 단순히 현재 행을 의미 합니다 . 따라서 다음과 같이 현재 줄에서만 찾을 수 있습니다.

:.s/<search_string>/<replace_string>/g

주목해야 할 또 다른 사항은 :range와 find / replace 명령 사이 에 초를 삽입 해도 아무런 영향을 미치지 않습니다. 즉, 이러한 명령은 여전히 ​​작동합니다.

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g

1
> 예 : 6-10, 14-18 행의 텍스트를 바꾸고 11-13 행의 텍스트는 바꾸지 마십시오. — 답장이이 질문에 답하지 않습니까?
poige

27

두 개의 찾기 / 바꾸기 시퀀스로 할 수 있습니다

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

두 번째로 조정해야 할 것은 범위이므로 모두 입력하는 대신 마지막 명령을 기억하고 범위 만 편집합니다.


20

vim에서 모든 라인에 영향을 줄 혼란 스러우면 아래에서 사용하십시오.

 :%s/foo/bar/gc  

각 'foo'를 'bar'로 변경하되 먼저 확인을 요청하십시오. 예인 경우 'y'를 누르고 아니오 인 경우 'n'을 누르십시오. 그 후 저장하는 것을 잊지 마세요

:wq

1
c범위를 지정하는 것 외에도 실제로 플래그를 사용할 수 있으므로 :6,10s/<search_string>/<replace_string>/c작동합니다. c의 약자 confirm. 나는 c플래그가 존재한다고 생각하지 않은 단어를 실수로 바꾸는 것을 방지하기 위해 플래그를 자주 사용합니다 .
울프슨

16

VI 검색 및 바꾸기 명령 예제

“foo”라는 단어를 찾고“bar”로 바꾸고 싶다고합시다.

첫 번째 히트 [Esc]

: (콜론)을 %s/foo/bar/입력하고 [Enter] 키를 누르십시오

:%s/foo/bar/


11
귀하의 :%s/<search_string>/<replace_string>/g명령은 전체 파일에있는 모든 항목을 대체합니다. 질문에 대한 정확한 대답은 아니지만 그럼에도 불구하고 유용합니다 :)
tanius

@tanius 사실 그것은 내 문제에 대한 가장 직접적인 대답이었습니다. ""선택된 "행에서 vim에서 문자열 찾기 및 바꾸기"로 질문을 수정하는 것을 고려할 수 있습니다.
Omid N

9

현재 줄 번호를 입력 할 필요가 없습니다.

현재 줄 ( )과 다음 두 줄 ( ) foobar대해 각각을 변경하려면 .다음을 +2수행하십시오.

:.,+2s/foo/bar/g

당신이 변경되기 전에 확인하려는 경우, 교체 ggc:

:.,+2s/foo/bar/gc

내가 자주 사용하는 또 다른 좋은 점 :.,$s/foo/bar/gc은 현재 줄에서 시작하여 파일 끝까지 검색 및 교체하는 것입니다.
울프슨

3

검색 및 교체

:%s/search\|search2\|search3/replace/gci

g => 글로벌 검색

c => 먼저 확인 요청

i => 대소 문자 구분

확인없이 직접 교체하려면 아래 명령을 사용하십시오.

:%s/search/replace/g

각 교체를 확인하려면 아래 명령을 실행하십시오.

:%s/search/replace/gc

먼저 확인을 요청하십시오. 여기서 검색은 대소 문자를 구분하지 않습니다.

:%s/search/replace/gci

1

시각적 선택을 통해 범위를 지정하는 것은 가능하지만 운영자가 선택할 수있는 몇 줄에 걸쳐 매우 간단한 조작이있을 경우 이러한 명령을 연산자로 적용하는 것이 가장 좋습니다.

슬프게도 표준 vim 명령으로는 수행 할 수 없습니다. !를 사용하여 일종의 해결 방법을 수행 할 수 있습니다. (필터) 연산자 및 모든 텍스트 개체. 예를 들어, 작업을 단락에 적용하려면 다음을 수행하십시오.

!ip

"연산자를 적용하십시오! 단락 안에"로 읽어야합니다. 필터 연산자는 명령 모드를 시작하고 문자 범위 "!"다음에 줄 범위를 자동으로 삽입합니다. 바로 후에 삭제할 수 있습니다. 이것을 적용하면 다음 단락에 적용됩니다.

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

"! ap"을 누른 후의 결과는 다음과 같습니다.

:.,.+5

'.'로 (점)은 현재 라인을 의미하며, 현재 라인과 5 라인 사이의 범위는 작업에 사용됩니다. 이제 이전과 같은 방법으로 대체 명령을 추가 할 수 있습니다.

나쁜 부분은 후자를 적용 할 텍스트를 선택하는 것이 쉽지 않다는 것입니다. 좋은 부분은 크기가 다른 다른 유사한 텍스트 범위 (이 경우 단락)에 대한 범위 삽입을 반복 할 수 있다는 것입니다. 즉, 나중에 더 큰 단락 '.'을 선택하려면 바로 그 것입니다.

또한 시맨틱 텍스트 객체를 사용하여 작동 범위를 선택하려는 아이디어가 마음에 들면 동일한 방법으로 더 쉬운 방식으로 플러그인 EXtend.vim 을 확인할 수 있습니다.


0

이 질문에 대답하려면 :

:40,50s/foo/bar/g

이 줄에서 40 번째 줄과 50 번째 줄 (포함) 사이에서 foo를 bar로 바꾸십시오.이 명령을 실행할 때 현재 어떤 줄이든 가능합니다.

:50,40s/foo/bar/g

또한 vim은 comfirm을 요청하고 첫 번째 명령을 입력 한 것처럼 교체를 수행합니다.

:,50s/foo/bar/g

이 줄에서 현재 줄과 50 번째 줄 사이의 foo를 bar로 바꿉니다. (50 라인 vim 이후에 라인에 있다면 다시 확인을 요청합니다)

vim과 Eclipse의 vrapper 플러그인의 차이점을 명확히하려면 :

varpper에서

:,50s/foo/bar/g 명령이 작동하지 않습니다.

:50,40s/foo/bar/g 확인을 요구하지 않고 작동합니다.

Vrapper 버전 0.74.0 이하의 경우.


-5
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

위의 정보를 다른 정보로 바꾸고 싶다고 가정하십시오.

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

이것에서 위의 내용은 ( sys.pkg.mpu.umc.kdk.) 로 대체됩니다 .


이것이 실제로 질문에 대답하는지 잘 모르겠습니다. 이 질문에서 입력하는 사람은 이미 %s입력을 수정하는 방법을 알고 있지만 "반 세계적으로"하는 방법을 알고 싶어합니다 (즉, 그의 사양은 6-10 행과 14-18 행이지만 11- 행에는 표시되지 않습니다) 13).
Brandon Buck

1
또한 "COMMAND"는 무엇입니까? 그리고 당신은 기울고 이쑤시개 증후군으로 고통 받고 있습니다 .
Martin Tournoij

이 증후군을 치료하려면, 대신 기본의 구분 기호로 다른 문자를 사용할 수 있습니다 /, 예를 들어 !, @, _::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.