Sostituire due stringhe tra loro


9

Vorrei cambiare tutte le occorrenze di una stringa (diciamo stringa1) con un'altra stringa (diciamo stringa2) e viceversa. Per essere precisi, ho un lungo documento e queste stringhe si verificano molte volte. Quello che faccio attualmente è sostituire string1 -> string3, quindi string2 -> string1 e infine string3 -> string2.

Mi chiedo se c'è già una funzione in emacs che lo fa. Altre soluzioni sono le benvenute.

Modifica : questo è in realtà un duplicato della domanda collegata nel commento. Ma il problema è che la risposta accettata a quella domanda non sempre funziona (vedi il commento sotto). Penso che sia meglio aspettare fino a quando l'autore di quella risposta accettata corregga la sua risposta o venga fuori qualche altra soluzione. In secondo luogo, prima di pubblicare la mia domanda, ho cercato su Google la domanda e quella domanda non è stata visualizzata. Penso che avere a volte due domande duplicate sia utile poiché usano parole diverse e se un utente trova quella duplicata, può trovare quella giusta.

Modifica 2: la risposta accettata della funzione di ricerca / sostituzione simile per lo scambio di testo sembra andare bene ora.


4
Possibile duplicato della funzione Cerca / sostituisci per lo scambio di testo
T. Verron,

@ T.Verron Ho provato a usare la risposta accettata del tuo link per sostituire "This" con "that" nel buffer di memoria virtuale ma non funziona.
Nome

Forse ho accettato troppo in fretta. Commentare gli ultimi due argomenti ( backwardse region-noncontiguous-p) nel call di perform-replacefa sì che funzioni qui (emacs 24.3). Lo testerò su emacs 25 quando avrò un'occasione prima di modificare l'altra risposta.
T. Verron,

@ T.Verron, al contrario, l'altra soluzione che suggerisce di usare il pacchetto plur. Sembra funzionare in questa situazione senza problemi.
Nome

Ho cambiato la risposta accettata nell'altra domanda. Per quanto riguarda Google, sì, anch'io ho avuto difficoltà a trovare parole chiave per comunicare ciò che stavo cercando di fare. E sì, i duplicati sono buoni! blog.stackoverflow.com/2010/11/…
T. Verron

Risposte:


11

Per il caso interattivo query-replace-regexp (CM-%) può farlo, usando il relativamente sconosciuto \, per la sostituzione.

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

Se il testo sostitutivo contiene \, seguito da un'espressione lisp, utilizza il valore di quell'espressione come sostituto. In questo caso, l'espressione è un "if" che accetta una condizione e il valore restituito per i casi vero e falso.

Nei commenti si consiglia di utilizzare

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

Questo funziona perché \ 1 sarà "stringa1" se il modello corrisponde a stringa1 e sarà nullo altrimenti. Lisp considera vero qualsiasi valore non nullo. Mentre questo funziona ed è più breve, penso che la mia risposta sia più utile. Penso che il codice sia più leggibile per qualcuno la cui conoscenza lisp è limitata. Ha un secondo vantaggio poiché funziona ancora se viene dato il modello "from" come

\(string1\|string2\)

o anche

string1\|string2

2
Alcuni commenti nel candidato duplicato hanno suggerito la sintassi più semplice \,(if \1 "string2" "string1"), usando regexp \(string1\)\|string2.
T. Verron,

Vedi gli ultimi due paragrafi di (emacs) Regexp Replace.
Basilio

-1

Bene, forse con una macro sarebbe facile:

F3C-saRETC-bM-tF4. L'uso di questa macro sulla tua domanda urla questo risultato:

Vorrei cambiare tutte le occorrenze della stringa a (diciamo stringa1) con un'altra stringa (diciamo stringa2) e viceversa. Per essere precisi, ho un documento lungo e queste stringhe si verificano molte volte. Quello che faccio attualmente è sostituire string1 -> string3, quindi string2 -> string1 e infine string3 -> string2.

Mi chiedo se in emacs sia già presente la funzione a. Altre soluzioni sono le benvenute.

Sto trasponendo posizioni tra qualunque parola sia dopo una ae quella parola. È possibile modificare successivamente tale macro per trasporre anche altre parole senza bisogno di ridefinire l'intera macro, è possibile modificare la macro con C-xC-kRET.


1
Non penso che la domanda sia legata al recepimento delle parole.
T. Verron,

@ T.Verron Lo è, ma a quanto pare vuole un approccio più automatizzato.
Shackra,

1
Quello che fa la tua macro è scambiare (trasporre) ogni "a" con la parola successiva. "una stringa"> "stringa a" ecc. Quello che vuole fare è ad esempio sostituire ogni "a" con "la" e ogni "la" con "a".
T. Verron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.