İki dizeyi birbiriyle değiştirin


9

Bir dize (dize1) başka bir dize (dize2) ve tersi ile tüm oluşumları değiştirmek istiyorum. Kesin olmak gerekirse, uzun bir belgem var ve bu dizeler birçok kez oluşur. Şu anda yaptığım şey, string1 -> string3, sonra string2 -> string1 ve son olarak string3 -> string2'nin yerini almak.

Emacs'ta bunu yapan bir işlev olup olmadığını merak ediyorum. Diğer çözümler de memnuniyetle karşılanmaktadır.

Düzenleme : Bu aslında yorumda bağlantılı sorunun bir kopyasıdır. Ancak sorun şu ki, bu sorunun kabul edilen cevabı her zaman işe yaramıyor (aşağıdaki açıklamaya bakınız). Bu kabul edilen cevabın yazarının cevabını düzeltmesini veya başka bir çözüm ortaya çıkmasını beklemenin daha iyi olacağını düşünüyorum. İkinci olarak sorumu göndermeden önce soruyu araştırdım ve bu soru ortaya çıkmadı. Farklı ifadeler kullandıkları için iki yinelenen soruya sahip olmanın bazen yararlı olduğunu düşünüyorum ve bir kullanıcı yinelenen bir tane bulursa, doğru olanı bulabilir.

Edit 2: Metni değiştirmek için Arama / değiştirme benzeri özelliğinin kabul edilen cevabı şimdi iyi görünüyor.



@ T.Verron Bağlantınızın kabul edilen cevabını, sıfırlama tamponundaki "Bu" yerine "o" ile değiştirmek için kullanmaya çalıştım, ancak çalışmıyor.
İsim

Belki çok hızlı kabul ettim. Son iki argümanın yorumlanması çağrısında yorumlanması ( backwardsve region-noncontiguous-p) perform-replaceburada çalışmasını sağlar (emacs 24.3). Diğer cevabı düzenlemeden önce bir fırsat bulduğumda emacs 25'te test edeceğim.
T. Verron

@ T.Verron ise tam tersi, plur paketini kullanmanızı öneren diğer çözüm. Bu durumda sorunsuz çalışıyor gibi görünüyor.
İsim

Diğer soruda kabul edilen cevabı değiştirdim. Google ile ilgili olarak, evet, ben de yapmaya çalıştığım şeyi iletmek için anahtar kelimeler bulmakta sorun yaşadım. Ve evet, kopyalar iyi! blog.stackoverflow.com/2010/11/…
T. Verron

Yanıtlar:


11

Etkileşimli vaka için query-replace-regexp (CM-%), değiştirme için nispeten bilinmeyen \ kullanarak bunu yapabilir.

C-M-% \(string1\)\|\(string2\)
\,(if (equal \& "string1") "string2" "string1")

Değiştirilen metin \ ve ardından lisp ifadesi içeriyorsa, bu ifadenin değerini değiştirme olarak kullanır. Bu durumda ifade, doğru ve yanlış durumlar için bir koşul ve döndürme değeri alan bir "if" olur.

Yorumlarda kullanılması tavsiye edilir

\, (\ 1 "string2" "string1" ise)

Bu, desen string1 ile eşleşirse \ 1 "string1" olacağı ve aksi halde nil olacağı için çalışır. Lisp, sıfır olmayan herhangi bir değeri true olarak alır. Bu işe yarar ve daha kısa olsa da, cevabımın daha yararlı olduğunu düşünüyorum. Kod lisp bilgisi sınırlı birine daha okunabilir olduğunu düşünüyorum. "Gönderen" paterni şu şekilde verilirse çalıştığı için ikinci bir avantaja sahiptir.

\(string1\|string2\)

ya da

string1\|string2

2
Yinelenen adaydaki bazı yorumlar \,(if \1 "string2" "string1"), normal ifadeyi kullanarak daha basit sözdizimini önerdi \(string1\)\|string2.
T. Verron

Konusundaki son iki paragrafa bakın (emacs) Regexp Replace.
Basil

-1

Belki bir makro ile bu kolay olurdu:

F3C-saRETC-bM-tF4. Sorunuzda bu makroyu kullanmak şu sonucu verir:

Başka bir dize (dize2) ile dize a (dize1) tüm oluşumlarını değiştirmek istiyorum ve tersi. Kesin olmak gerekirse, uzun bir belgem var ve bu dizeler birçok kez oluşur. Şu anda yaptığım şey, string1 -> string3, sonra string2 -> string1 ve son olarak string3 -> string2'nin yerini almak.

Bunu yapan emacs'de zaten bir işlev olup olmadığını merak ediyorum. Diğer çözümler de memnuniyetle karşılanmaktadır.

Bir kelimeden sonra ne olursa olsun kelime arasında pozisyon aktarıyorum a. Daha sonra tüm makroları yeniden tanımlamanıza gerek kalmadan diğer kelimeleri de aktarmak için bu makroyu düzenleyebilir, makroyu düzenleyebilirsiniz C-xC-kRET.


1
Sorunun kelimeleri aktarma ile ilgili olduğunu sanmıyorum.
T. Verron

@ T.Verron Öyle, ama daha otomatik bir yaklaşım istiyor gibi görünüyor.
shackra

1
Makronuzun yaptığı her bir "a" kelimesini bir sonraki kelimeyle değiştirmek (aktarma). "bir dize"> "dize a" vb. Yapmak istediği şey, örneğin her bir "a" yı "the" ve her "a" yerine "a" ile değiştirmektir.
T. Verron
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.