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.