Birden çok satırda vim'de dizeleri bulma ve değiştirme


354

Yapabileceğim :%s/<search_string>/<replace_string>/gbir dosya genelinde bir dize değiştirilmesi için ya da :s/<search_string>/<replace_string>/son satırın yerine.

Vim'deki seçici satırlardan kelimeleri nasıl seçebilir ve değiştirebilirim?

Örnek: hatlarından metni değiştirmek 6-10, 14-18ancak gelen 11-13.



Yanıtlar:


255

:&&Komut aynı bayraklarıyla son ikame tekrarlar. Ek aralıkları sağlayabilirsiniz (ve istediğiniz kadar birleştirebilirsiniz):

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

Yine de birçok aralığınız varsa , bir döngü kullanmayı tercih ederim:

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

5
Teşekkürler. Gelecekteki kullanıcılar için not - :6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&ayrıca çalışır, fordöngü hatırlamayı ve yürütmeyi daha kolay hale getirir.
mu 無

5
Beğendiğine sevindim! :Biraz daha tuş vuruşlarını kaydedebilir ve böylece sonraki komutlar üzerine, btw isteğe bağlıdır.
Ingo Karkat

2
:&&haftada yüzlerce tuşa dokunmamı sağlayacak. Teşekkürler!
pdoherty926

Vimimde sonunda 'g' olmadan çalışır. Belki de çizgi aralığını belirttiğinizde global bayrağa ihtiyaç duymaz
Tayyar R

3
@TayyarR Aralık çizgileri (dikey olarak, tabiri caizse) kaplarken, 'g' bayrağı çizgi içinde yalnızca bir veya tüm eşleşmelerin (yatay olarak) değiştirilip değiştirilmeyeceğini belirler.
Ingo Karkat

390

Hepsini değiştir:

:%s/foo/bar/g

Her 'foo' oluşumunu bulun (tüm satırlarda) ve yerine 'bar' koyun.

Belirli hatlar için:

:6,10s/foo/bar/g

6. satırdan 10. satıra dahil tüm satırlar için her bir 'foo'yu' bar 'olarak değiştirin.


4
/ g'nin amacı nedir? Üzgünüz,
linux'da yeniyim

4
@RajaAnbazhagan Bu ifadenin sonuncusu /, sonuncudan sonra , operasyon için bayrakları belirttiğiniz yerdir. Bu komut normalde bir satırdaki ilk eşleşmenin yerini alır ; İle gbayrağı tüm oluşumlarını yerini alacak.
Litty

17
Başka bir kişinin kopyasını alıp geçecekseniz, kaynaklarınıza (vim.wikia.com/wiki/Search_and_replace) gerçekten başvurmalısınız.
Andrew S

2
%Şey çalışır! Aksi takdirde, sadece ilk olay.
Santosh Kumar

8
%=> Bu komutu tüm satırlarda çalıştır. g=> aynı satırdaki birden çok olayla eşleşir.
shaahiin

55

Yan not olarak, satır numaralarını yazmak yerine, görsel modlardan birinde bulmak / değiştirmek istediğiniz satırları vurgulayın:

  • VISUALmodu ( V)
  • VISUAL BLOCKmod ( Ctrl+ V)
  • VISUAL LINEmodu ( Shift+ V, durumunuzda en iyi şekilde çalışır)

Değiştirilecek satırları seçtikten sonra komutunuzu yazın:

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

Aralığın '<,'>sizin için otomatik olarak ekleneceğini göreceksiniz:

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

Burada '<sadece ilk vurgulanan satır ve son vurgulanan satır'> anlamına gelir .

Not davranışı beklenmedik olabileceğini zaman içinde NORMALmoda: '<ve '>başlangıç ve biriyle yapılabilir son vurgulamak sonuna nokta VISUALmodları. Bunun yerine, NORMALmodda, .sadece geçerli hat anlamına gelen özel hat numarası kullanılabilir . Bu nedenle, sadece şu anki satırda bulabilir / değiştirebilirsiniz:

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

Dikkat edilmesi gereken başka bir şey :, aralık ile bul / değiştir komutu arasına bir saniye eklemenin zarar vermediğidir, başka bir deyişle, bu komutlar yine de çalışır:

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

1
> Örnek: 6-10, 14-18 satırlarındaki metni değiştirin, ancak 11-13 satırından değil. - Cevabınız bu soruya cevap vermiyor, değil mi?
poige

27

Bunu iki bul / değiştir dizisiyle yapabilirsiniz

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

Ayarlamanız gereken ikinci şey aralıktır, bu yüzden hepsini yazmak yerine, son komutu hatırlar ve sadece aralığı düzenlerdim


21

Vim'de hangi satırların etkileneceğinden emin değilseniz, aşağıda kullanın

 :%s/foo/bar/gc  

Her 'foo'yu' bar 'olarak değiştirin, ancak önce onay isteyin. Evet için 'y' ve hayır için 'n' tuşlarına basın. Bundan sonra kurtarmayı unutma

:wq

2
cAralığı belirtmeye ek olarak bayrağı da kullanabilirsiniz , bu yüzden :6,10s/<search_string>/<replace_string>/cçalışır. canlamına gelir confirm. cBayrağı, orada da bulunduğunu düşünmediğim kelimeleri yanlışlıkla değiştirmemek için sık sık kullanıyorum .
Wolfson

16

VI arama ve değiştirme komut örnekleri

Diyelim ki “foo” adında bir kelime bulmak ve “bar” ile değiştirmek istiyorsunuz.

İlk isabet [Esc]tuşu

Şunu yazın: (iki nokta üst üste) %s/foo/bar/ve ardından [Enter] tuşuna basın

:%s/foo/bar/


11
Sizin :%s/<search_string>/<replace_string>/gkomut bütün dosyasındaki tüm oluşumlarını yerini alacak. Sorunun cevabı tam olarak değil, yine de yararlı :)
tanius

@tanius Aslında sorunumun en açık cevabı buydu. "Seçili" satırlarda "vimdeki dizeleri bulma ve değiştirme" sorusunu değiştirmeyi düşünebilirsiniz
Omid N

9

Mevcut satır numarasını girmekle uğraşmak zorunda değiliz.

Her değiştirmek isterseniz fooiçin bargeçerli hat (için .) ve iki yanındaki çizgilerin ( +2), basitçe yapın:

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

Eğer değişiklikler yapılmadan önce onaylamak istiyorsanız, değiştirin gile gc:

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

Sık kullandığım bir diğer güzel şey, :.,$s/foo/bar/gcarama ve mevcut satırdan dosyanın sonuna kadar değiştirmektir.
Wolfson

3

Ara ve değiştir

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

g => global arama

c => Önce onay isteyin

i => Büyük / küçük harfe duyarlı değil

Onay olmadan doğrudan değiştirme istiyorsanız aşağıdaki komutu kullanın

:%s/search/replace/g

Her değiştirme için onay istiyorsanız, aşağıdaki komutu çalıştırın

:%s/search/replace/gc

İlk önce onay isteyin, burada arama büyük / küçük harfe duyarlı olmayacaktır.

:%s/search/replace/gci

1

Görsel seçim yoluyla aralığı belirtmek uygundur, ancak bir operatör tarafından seçilebilen sadece birkaç satır üzerinden çok basit işlemler olduğunda, bu komutları operatör olarak uygulamak en iyisidir.

Bu ne yazık ki standart vim komutları ile yapılamaz. Kullanarak bir tür geçici çözüm yapabilirsiniz! (filtre) operatörü ve herhangi bir metin nesnesi. Örneğin, işlemi bir paragrafa uygulamak için şunları yapabilirsiniz:

!ip

Bu, "İşleci! Paragraf içine uygula" şeklinde okunmalıdır. Filtre operatörü komut modunu başlatır ve otomatik olarak satır aralığını ve ardından değişmez bir "!" hemen sonra silebilirsiniz. Bunu uygularsanız, aşağıdaki paragrafa:

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" tuşuna bastıktan sonra sonuç şöyle olur:

:.,.+5

'.' (nokta), geçerli hat, geçerli hat ile sonraki 5 hat arasındaki aralık işlem için kullanılacak anlamına gelir. Artık yedek komutu daha önce olduğu gibi ekleyebilirsiniz.

Kötü yanı, bunun operatörün uygulanması için ikinci metni seçmenin daha kolay olmamasıdır. İyi tarafı, bunun, benzer boyuttaki diğer benzer metin aralıkları (bu durumda paragraflar) için aralığın eklenmesini tekrarlayabilmesidir. Yani, daha sonra aralığın büyük paragrafını seçmek istiyorsanız '.' doğru olacak.

Ayrıca, işlem aralığını seçmek için semantik metin nesneleri kullanma fikrini seviyorsanız , aynı şeyi ancak daha kolay bir şekilde yapabilen EXtend.vim eklentimi kontrol edebilirsiniz.


0

Bu soruyu cevaplamak için:

:40,50s/foo/bar/g

40. satır ile 50. satır (dahil) arasındaki bu satırlardaki foo'yu bar ile değiştirin, bu komutu yürüttüğünüzde şu anda herhangi bir satırda yapabilirsiniz.

:50,40s/foo/bar/g

ayrıca çalışır, vim sizden onay isteyecektir ve daha sonra ilk komutu girmişsiniz gibi değiştirmeyi sizin için yapacaktır.

:,50s/foo/bar/g

foo'yu şu anda bulunduğunuz hat ile 50. hat (dahil) arasındaki bu hatlardaki çubukla değiştirin. (50. satır SONRASI bir satırdaysanız tekrar onaylamanızı ister)

Vim ve Eclipse'in vrapper eklentisi arasındaki farkı netleştirmek için:

Varpper'da olduğunu unutmayın

:,50s/foo/bar/g komutu çalışmaz.

:50,40s/foo/bar/g onay istemeden çalışacaktır.

(Vrapper Sürüm 0.74.0 veya daha eski sürümler için).


-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

Yukarıdakileri başka bir bilgi ile değiştirmek isteyip istemediğinizi varsayalım.

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

Burada yukarıdaki ( sys.pkg.mpu.umc.kdk.) ile değiştirilecektir .


Bunun soruyu gerçekten cevapladığından emin değilim. Soruyu soran, %sgirdiyi değiştirmek için nasıl kullanılacağını zaten biliyor ama "yarı küresel" olarak nasıl yapılacağını bilmek istiyor gibi görünüyor (yani özellikleri 6-10 ve 14-18 satırlarıdır, ancak 11- satırlarında değil. 13).
Brandon Buck

1
Ayrıca "KOMUT" nedir? Ve yaslanmış kürdan sendromundan muzdaripsin .
Martin Tournoij

Bu sendroma Tedavi etmek için varsayılan yerine ayırıcı olarak başka bir karakter kullanabilirsiniz /, örneğin !, @, _::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.