Come posso cercare e sostituire un set di file?


9

Vorrei definire un set di file all'interno del quale posso cercare e sostituire il testo.

Chiarire:

Vorrei poter cercare, ad esempio, in tutti i file xk * .tex in una determinata directory (ed escludendo i file di backup). Vorrei anche poter cambiare l'espressione, ad esempio "incertezza", in "indeterminatezza" in tutti i file dd * .sh ed ee * .cls.

Qual è il modo standard per farlo?


@Claudio Potresti dare un'occhiata diredper trovare e sostituire un sottoinsieme di file in una determinata directory.
Squidly,

Ecco un esempio di "ricerca / sostituzione" in più file in una directory / progetto usando ag, wgrepe multiple-cursors.
Kaushal Modi,

Risposte:


4

Se stai lavorando a un progetto ben definito, puoi utilizzare occure grepstrutture all'interno di quel progetto tramite projectile. Paralizzando dalla sua descrizione github, tra i vari pezzi di funzionalità offerti da projectile, può fare:

  • sostituire nel progetto
  • multi-si verificano nei buffer di progetto
  • grep nel progetto
  • visita il progetto in diretta

4

Se tutti i file si trovano nella stessa directory, è possibile seguire questi passaggi. Baserò questo sul secondo esempio dato nei commenti:

  1. M-xdiredper aprire la directory pertinente in diredmodalità.
  2. %mper eseguire dired-mark-files-regexpin quella directory.
  3. Invio ^dd.*\.sh$, che equivale a regexpdd*.sh . Tali file saranno ora contrassegnati con un *e potrebbero anche apparire evidenziati in un colore diverso a seconda della combinazione di colori.
  4. Ripetere il passaggio 3 tutte le volte che è necessario, con qualsiasi regexp desiderato (ad es. ^ee.*\.cls$) Fino a quando tutti i file che si desidera modificare sono contrassegnati.
  5. Qper eseguire dired-do-query-replace-regexpsui file che hai contrassegnato.
  6. Immettere uncertaintye indeterminacycome stringhe di query. (Penso che questo farà distinzione tra maiuscole e minuscole. Se ne hai bisogno per non distinguere tra maiuscole e minuscole, ciò potrebbe richiedere una regexp, ma non ne sono sicuro.)

E questa è l'idea. Se è necessario ripeterlo più volte in cartelle diverse, è possibile registrare i passaggi 2-6 come macro (premere C-x (dopo il passaggio n. 1 e C-x )dopo il passaggio n. 6). E anche se non ti senti a tuo agio con elisp, puoi tradurre quella macro in elisp usando insert-kbd-macroe provare a hackerarla in una funzione utile.


1
Si prega di notare che in Emacsland, S-qnon significa shift+q, significa super+q. Dovresti solo scrivere Qse vuoi dire shift+q. Ho modificato il tuo commento per riflettere questo.
tata

2
In realtà no, S-qsignifica shift+q; super+qsarebbe scritto s-q.
Sue D. Nymme,

3

È possibile utilizzare M-x find-name-diredper ottenere un buffer diretto contenente collegamenti a tutti i file corrispondenti a un determinato modello di nome.

Utilizzare M-x find-grep-diredper ottenere un buffer diretto contenente quei file il cui contenuto corrisponde al modello grep fornito.

Ci sono molti altri comandi simili; quale è più appropriato dipende dalle tue esigenze, quindi ti preghiamo di considerare di aggiornare la tua domanda.

Quindi è possibile attraversare l'elenco dei file utilizzando le macro. Dai un'occhiata alla risposta di Brian per un esempio: https://emacs.stackexchange.com/a/9497/2005


1

Usa rgrep e wgrep.

Con rgrep puoi cercare tutti i regexp nei file il cui nome file corrisponde a un regexp e all'interno di una directory (e dei suoi sottodir)

con wgrep puoi modificare il buffer contenente i risultati della tua ricerca rgrep.

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.