Substitua duas cordas uma pela outra

9

Gostaria de alterar todas as ocorrências de uma string (digamos string1) por outra string (digamos string2) e vice-versa. Para ser preciso, tenho um documento longo e essas seqüências ocorrem muitas vezes. O que eu faço atualmente é substituir string1 -> string3, depois string2 -> string1 e finalmente string3 -> string2.

Gostaria de saber se já existe uma função no emacs que faça isso. Outras soluções são bem-vindas.

Editar : na verdade, é uma duplicata da pergunta vinculada no comentário. Mas o problema é que a resposta aceita para essa pergunta nem sempre funciona (veja o comentário abaixo). Eu acho que é melhor esperar até que o autor dessa resposta aceita corrija sua resposta ou alguma outra solução saia. Em segundo lugar, antes de postar minha pergunta, pesquisei no Google e essa pergunta não apareceu. Eu acho que ter duas perguntas duplicadas às vezes é útil, pois elas usam palavras diferentes e se um usuário encontrar a duplicada, ele poderá encontrar a correta.

Editar 2: a resposta aceita do recurso de pesquisa / substituição para troca de texto parece estar bem agora.

Nome
fonte
4
Possível duplicata do recurso
T. Verron 13/16
@ T.Verron Tentei usar a resposta aceita do seu link para substituir "This" por "that" no buffer de rascunho, mas ele não funciona.
Nome
Talvez eu tenha aceitado muito rápido. Comentar os dois últimos argumentos ( backwardse region-noncontiguous-p) na chamada de perform-replacefaz com que funcione aqui (emacs 24.3). Vou testá-lo no emacs 25 quando tiver uma ocasião antes de editar a outra resposta.
T. Verron 13/10
@ T.Verron, por outro lado, a outra solução sugerindo o uso do pacote. Parece funcionar nesta situação sem problemas.
Nome
Alterei a resposta aceita na outra pergunta. Em relação ao google, sim, também tive problemas para encontrar palavras-chave para transmitir o que estava tentando fazer. E sim, duplicatas são boas! blog.stackoverflow.com/2010/11/…
T. Verron

Respostas:

11

Para o caso interativo, query-replace-regexp (CM-%) pode fazer isso, usando o relativamente desconhecido \, para a substituição.

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

Se o texto de substituição contiver \, seguido de uma expressão lisp, ele usará o valor dessa expressão como substituição. Nesse caso, a expressão é um "se" que aceita uma condição e o valor de retorno para os casos verdadeiros e falsos.

Nos comentários, sugere-se usar

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

Isso funciona porque \ 1 será "string1" se o padrão corresponder a string1 e será nulo caso contrário. Lisp considera verdadeiro qualquer valor não nulo. Embora isso funcione e seja mais curto, acho que minha resposta é mais útil. Eu acho que o código é mais legível para alguém cujo conhecimento do cisco é limitado. Tem uma segunda vantagem, pois ainda funciona se o padrão "de" for fornecido como

\(string1\|string2\)

ou mesmo

string1\|string2
Icaro
fonte
2
Alguns comentários no candidato duplicado sugeriram a sintaxe mais simples \,(if \1 "string2" "string1"), usando o regexp \(string1\)\|string2.
44516 Ver T.
Veja os dois últimos parágrafos de (emacs) Regexp Replace.
Basil
-1

Bem, talvez com uma macro isso seja fácil:

F3C-saRETC-bM-tF4. O uso dessa macro em sua pergunta grita este resultado:

Gostaria de alterar todas as ocorrências da string a (digamos string1) por outra string (digamos string2) e vice-versa. Para ser preciso, tenho um documento longo e essas seqüências ocorrem muitas vezes. O que eu faço atualmente é substituir string1 -> string3, depois string2 -> string1 e finalmente string3 -> string2.

Gostaria de saber se já existe a função a no emacs que faz isso. Outras soluções são bem-vindas.

Estou transpondo posições entre qualquer palavra que está atrás de uma ae essa palavra. Mais tarde, você pode editar essa macro para transpor outras palavras, sem precisar redefinir a macro inteira, com a qual você pode editar C-xC-kRET.

shackra
fonte
11
Não acho que a questão esteja relacionada à transposição de palavras.
506 Verron #
@ T.Verron É, mas ele quer uma abordagem mais automatizada, ao que parece.
shackra
11
O que sua macro faz é trocar (transpor) cada "a" pela próxima palavra. "uma string"> "string a" etc. O que ele deseja fazer é, por exemplo, substituir cada "a" por "the" e cada "the" por "a".
50516 Ver todas as