Come posso aggiungere una stringa alla fine di ogni riga in Vim?


257

Voglio aggiungere *alla fine di ogni riga in Vim.

Ho provato il codice senza successo

:%s/\n/*\n/g

Vostro non funziona perché sul lato destro :s///, \ncorrisponde ad un carattere nullo. La sezione :help sub-replace-specialè rilevante.
doubleDown

Risposte:


355

:%s/$/\*/g

dovrebbe funzionare. Così dovrebbe, :%s/$/*/gcome sottolinea correttamente MrWiggles .


C'è un modo per inserire ' ' nella stessa colonna, poiché tutte le linee non hanno la stessa lunghezza, quindi la linea 1 potrebbe avere ' ' alla 15a colonna, ma la linea 2 ha '*' alla 25a colonna.
Aman Jain,

11
c'è solo 1 EOL per riga, quindi la gbandiera non è necessaria.
doubleDown

Volevo aggiungere / all'inizio di ogni riga: 1, $ s / ^ / \ / g ha funzionato per me.
farooqsadiq,

@dirkgently Come posso passare una variabile stringa come argomento a questo comando (sai, invece di *)?
Matheus Rotta,

353

Anche più breve del comando: search:

:%norm A*

Questo è ciò che significa:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Amico, non esiste alcun thread vi o vim da cui non imparo qualcosa. Oggi imparo a conoscere la norma. E come si dice a Cheers, "Norm!"
smcameron,

4
Per anteporre, dovresti semplicemente usare 0i *, 0 ti porta all'inizio della riga, i per la modalità di inserimento e * per *. D:
Rob,

7
Come VimGolfer non posso fare a meno di aggiungere che usando I*piuttosto che 0i*ti salverà una sequenza di tasti.
Jedidiah Hurt,

24
Un altro suggerimento: funziona anche per le gamme. Basta evidenziare le linee in modalità visiva e premere :, questo pre-riempirà il comando con il :'<,'>quale è possibile effettuare:'<,'>norm A*
Jedidiah Hurt

8
Per anteporre, utilizzare Iinvece -:%norm I*
Just Lucky Really

42

Anche:

:g/$/norm A*

Anche:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... Il secondo può essere usato anche con una selezione di linee. Bello!
Tim Fletcher,

Potresti spiegare il primo esempio, per favore?
Cody Poll

@CodyPoll gè un globalcomando che fa qualcosa con ogni riga corrispondente. $corrisponde a ogni riga. Potrebbe anche essere ^o .*. norm esegue i comandi che normalmente si utilizzano in modalità comando. Quindi A*significa aggiungere *alla fine della riga.
defhlt

41

Penso che usare la modalità di blocco visivo sia un metodo migliore e più versatile per affrontare questo tipo di cose. Ecco un esempio:

This is the First line.  
This is the second.  
The third.

Per inserire "Hello world". (spazio + appunti) alla fine di ciascuna di queste righe:

  • Su un carattere nella prima riga, premi Ctrl-V (o Ctrl-Q se Ctrl-V è incolla).
  • Premere jj per estendere il blocco visivo su tre righe.
  • Premere $ per estendere il blocco visivo alla fine di ogni riga. Premi A, quindi premi Spazio e digita Hello world. + quindi Esc.

Il risultato è:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(esempio da Vim.Wikia.com )


3
Invece di premere, jjpuoi premere Gper spostarti sull'ultima riga. Ciò è utile in file di grandi dimensioni, dove jnon è pratico premere fino a quando non si preme l'ultima riga.
nash

Concordo sul fatto che qui il blocco visivo sia più pulito, anche più estensibile
Peter Dolan,

Nota che questo non sembra funzionare su tutte le linee all'inizio, ma dopo aver premuto Esc passa attraverso e lo aggiunge a tutti.
Noumenon,

Visual Block causa problemi ed errori quando si utilizza vim come estensione per altre cose, come VS Code. In questi casi, la ricerca e la sostituzione dell'utente originale richiesto è l'opzione affidabile.
Brettins,

assicurati di usare la maiuscola A, la "a" minuscola non funziona.
Jeff Hoye,

14

Se vuoi aggiungere Hello world alla fine di ogni riga:

:%s/$/HelloWorld/

Se vuoi farlo per un numero specifico di righe, diciamo dalle 20 alle 30:

:20,30s/$/HelloWorld/

Se vuoi farlo all'inizio di ogni riga, usa:

:20,30s/^/HelloWorld/

6

gAlla fine non ti serve davvero . Quindi diventa:

:%s/$/*

O se vuoi solo il *alla fine di, dire le righe 14-18:

:14,18s/$/*

o

:14,18norm A*


5

Un'opzione è:

:g/$/s//*

Questo troverà ogni ancoraggio di fine linea e lo sostituirà con *. Dico "sostituto" ma, in realtà, è più un'appendice poiché l'ancoraggio è una cosa speciale piuttosto che un personaggio normale. Per ulteriori informazioni, consultare Potenza di g - Esempi .


Cosa significa s // nella regex? Conosco un comando simile,: g / / / p, (grep). Sono abbastanza sicuro che il tuo comando sia vicino al mio, almeno nella struttura.
Léo Léopold Hertz

1
La s è sostitutiva: sostituisce l'ancora di fine linea con l'asterisco (beh, in realtà non lo sostituisce poiché è un punto di ancoraggio).
paxdiablo,

3
:% S / \ n / * \ r / g

Il tuo primo è corretto altrove, ma Vim deve avere una gestione newline diversa per qualche motivo.


Nella mia versione di Vim \ n funziona, ma questo sostituisce la nuova riga con un *, unendo efficacemente le linee.
Nathan Fellman,

1
Si è verificato che questo comando funzioni correttamente su ogni versione di Vim che ho provato. Stai usando la versione di Windows o qualcosa del genere?

1
%s/\s*$/\*/g

questo farà il trucco e assicurerà che gli spazi iniziali vengano ignorati.

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.