2010-01-20 12 views
23

Ho qualcosa di simile a <Foobar Name='Hello There'/> e ho bisogno di cambiare le virgolette singole tra virgolette. Ho provato :s/\'.*\'/\"\0\" ma ha finito per produrre <Foobar Name="'Hello There'"/>. La sostituzione di \0 con \1 ha prodotto solo una stringa vuota all'interno delle virgolette doppie: c'è qualche sintassi speciale che mi manca e devo rendere solo la stringa trovata ("Hello There") tra le virgolette assegnate a \1?Sostituire le virgolette attorno alle stringhe in Vim?

risposta

20

è necessario utilizzare raggruppamenti:

:s/\'\(.*\)\'/\"\1\" 

In questo modo argomento 1 (vale a dire, \ 1) sarà conforme a ciò che è delimitata da \ (e \).

2

È necessario inserire parentesi tonde attorno alla parte dell'espressione che si desidera acquisire.

s/\'\(.*\)\'/"\1"/ 

Tuttavia, si potrebbero avere problemi con la corrispondenza involontaria. Potresti semplicemente sostituire le singole virgolette con virgolette nel tuo file?

5

a meno che manchi qualcosa, s/\'/"/g non funzionerebbe?

+0

Questo era il mio compromesso, ma sentivo che non era giusto, specialmente se ci fosse una singola citazione all'interno dell'attributo. Non penso che ciò possa accadere in XML, ma potrebbe accadere in qualche altra situazione in fondo alla strada che richiede questa stessa soluzione. – ravuya

+0

Una virgoletta singola all'interno di un attributo a virgolette singole deve essere ''' e una virgoletta doppia all'interno di un attributo a virgola doppia deve essere '"'. Ovviamente una singola citazione potrebbe vivere all'interno di un attributo con due virgolette e viceversa ... – ephemient

1

Hai l'idea giusta: vuoi avere "\1" come clausola di sostituzione, ma devi prima mettere la parte "Hello There" nel gruppo di cattura 1 (0 è l'intera corrispondenza). Prova:

:%/'\(.*\)'/"\1"

13

%s/'\([^']*\)'/"\1"/g

Si vuole utilizzare [^']* invece di .* altrimenti

'apples' are 'red' otterrebbe convertito in "apples' are 'red"

+1

Oppure usare '. \ {-}' invece di '. *'. Vedi ': help/\ {-'. –

48

C'è anche surround.vim, se stai cercando di fallo abbastanza spesso. Dovresti usare cs'" per modificare le virgolette circostanti.

+0

Grazie per il collegamento surround.vim - stavo desiderando per questo da molto tempo. – ThomasH

+0

c'è un modo per mappare questo ad un comando leader? Non riesco a farlo: \ –

+0

Non dovresti aver bisogno di associarlo a un comando leader, poiché usa un movimento 'cs' personalizzato con due argomenti -' '' come obiettivo, e '" 'come – kejadlen

6

Solo una cronaca - per sostituire tutte le virgolette con il singolo, questa è l'espressione regolare corretta - in base a esempio di rayd09 sopra

:%s/"\([^"]*\)"/'\1'/g 
0

Presumendo che si vuole fare questo su un intero file ...

Modo N:

ggvG$ [SHIFT+:] 

Modalità X:

'<,'>/'/" [RET] 
Problemi correlati