Posso fare: s operare solo sull'ultima partita della linea?


16

:s/pattern/replacementopera sulla prima partita e :s/pattern/replacement/gsu tutti.

Come operare solo sull'ultimo?

Risposte:


18

io userei \zs

:%s/.*\zspattern/replacement/

Un po 'di spiegazione:

  • . rappresenta un singolo personaggio
  • * rappresenta una corrispondenza avida (il maggior numero possibile)

In Vim è possibile utilizzare ancore di larghezza zero \zse \zedefinire l'inizio e la fine del modello cercato, che si desidera abbinare. Qualsiasi cosa prima \zse dopo \zenel tuo schema rimarrà inalterata dalla sostituzione.

Per rendere più facile da capire, vorrei utilizzare questo esempio da Wikia 's Ricerca e sostituzione :

Salvare la digitazione utilizzando \zse \zeper impostare l'inizio e la fine di un motivo. Ad esempio, anziché:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

Uso:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Per ulteriori informazioni, guarda


Potete per favore fornire una descrizione di base di cosa \zsfa la vostra risposta?
EvergreenTree

3
Vale la pena notare che il motivo per cui funziona è perché .*è avido .
Wildcard il

7

Puoi cercare l'ultima partita raggruppando tutti \(.*\), ma l'ultima volta di pattern. Quindi uscire con il gruppo acquisito \1e aggiungere il replacement.

:%s/\(.*\)pattern/\1replacement/

(Questo è inferiore alla \zssoluzione di @ ryuichiro , in quanto il tuo \1approccio è funzionalmente equivalente, ma più dettagliato. (D'altra parte, può essere più facile da ricordare per alcuni, in particolare se sono usati per altri sapori regex.))
Aaron Thoma il

0

Per completezza, ho pensato di pubblicare un'alternativa. Vim ha più elementi alcuni dei quali sono simili alle asserzioni di ricerca di espressioni regolari più standard (lookahead / lookbehind negativo / positivo). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

In questo caso vogliamo uno sguardo negativo \@!, nel senso che vogliamo affermare che l' atomo che precede l'elemento non si verifica dopo il modello . In questo caso l'atomo è il modello stesso preceduto da qualsiasi altra cosa:

:%s/pattern\(.*pattern\)\@!/replacement/

La parte tra parentesi è a larghezza zero e non è inclusa nella corrispondenza, quindi non viene sostituita dalla sostituzione.

:h \@!per ulteriori informazioni o :h pattern-multi-itemsper l'intera sezione contenente altre varianti di lookaround.

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.