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.