Cosa significa sostituire le barre (/) con punti esclamativi (!) In un comando sostitutivo?


13

Recentemente ho visto un comando sostitutivo in cui l'autore ha avuto il /sostituito da un !simile in questo modo::s!abc!ABC!g

Ho provato a trovare della documentazione su questo utilizzo ma non sono riuscito a trovare nulla di rilevante. Quindi ho provato a sperimentare da solo e ancora una volta non sono riuscito a capire la vera differenza tra i due segni. Ecco cosa ho trovato:

  • Non è possibile mescolare !e /in un comando. Ad esempio :s!abc/ABCfallisce.
  • Può essere utile usare !per evitare di sfuggire a /in un modello. Ad esempio, se voglio sostituire </con %posso usare al :%s!</!%!gposto di :%s/<\//%/g.
  • Sembra che in alcuni casi alcuni regex non funzionino /e funzionino correttamente, !ma dato che non sono davvero un esperto di regex non ne sono sicuro.

Quindi la mia domanda è semplice: qual è il vantaggio di usare !un comando sostitutivo e quando dovrei decidere di usarlo invece di /?



In effetti ho scritto un doppio post per errore, l'ho segnalato qualche minuto fa per sapere cosa avrei dovuto fare.
statox

Risposte:


22

Da :help :global:

Invece del '/' che circonda il {pattern}, puoi usare qualsiasi altro carattere a singolo byte, ma non un carattere alfabetico, '\', '"' o '|'. Questo è utile se vuoi includere un '/' in il modello di ricerca o la stringa di sostituzione.

Come hai già escogitato dalla tua sperimentazione, questo serve a prevenire la cosiddetta " sindrome dello stecchino pendente ". Considera questo:

:%s/\/home\/martin\/test/\/home\/jake\/x/

contro:

:%s!/home/martin/test!/home/jake/x!

La seconda forma è ovviamente molto più leggibile.

Questa è l'unica ragione per cui puoi cambiare il delimitatore; per renderlo più leggibile per noi umani. Al computer non importa.

Alcuni altri programmi sono ancora più flessibili, sedad esempio in GNU puoi usare xcome delimitatore se lo desideri. sed sxaxbxg fileè lo stesso di sed s/a/b/g file.


Per quanto riguarda la leggibilità, preferisco (e suggerisco) :%s@/home/martin/test@/home/jake/x@, poiché il "grasso" @rende ancora più facile vedere dove iniziano / finiscono le singole parti dell'istruzione.
DevSolar,

@DevSolar ho trovato che :%s#/home/martin/test#/home/jake/x#funziona ancora meglio, ma è solo un'opinione personale.
Amit Gold,
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.