Sostituzione virgolette intorno stringhe in Vim?
Domanda
Ho qualcosa di simile a <Foobar Name='Hello There'/>
e la necessità di cambiare le virgolette di virgolette doppie. Ho provato :s/\'.*\'/\"\0\"
ma è finito per produrre <Foobar Name="'Hello There'"/>
. Sostituzione del \0
con \1
prodotto solo una stringa vuota all'interno della virgolette -? C'è qualche sintassi speciale che mi manca che ho bisogno di fare solo la stringa trovata ( "Ciao There") all'interno delle virgolette assegnano a \1
Soluzione
È necessario utilizzare raggruppamenti:
:s/\'\(.*\)\'/\"\1\"
In questo modo argomento 1 (cioè, \ 1) corrisponderà a ciò che è delimitata da \ (e \).
Altri suggerimenti
C'è anche surround.vim , se stai cercando di farlo abbastanza spesso. Usereste cs'"
cambiare citazioni circostante.
%s/'\([^']*\)'/"\1"/g
Si vuole utilizzare [^']*
invece di .*
altrimenti
'apples' are 'red'
otterrebbe convertito "apples' are 'red"
a meno che non mi manca qualcosa, non sarebbe s/\'/"/g
lavoro?
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
Hai bisogno di mettere tra parentesi tonde attorno alla parte dell'espressione che si desidera catturare.
s/\'\(.*\)\'/"\1"/
Ma, si potrebbe avere problemi con corrispondenza non intenzionale. Potreste essere in grado di sostituire semplicemente uno stesso citazioni con doppi apici nel file?
Hai avuto l'idea giusta - si vuole avere "\1"
come clausola di sostituzione, ma è necessario mettere il "Ciao There" parte del gruppo di cattura 1 primo (0 è l'intero match). Prova:
:%/'\(.*\)'/"\1"
Presumendo che si vuole fare questo su un intero file ...
Modalità N:
ggvG$ [SHIFT+:]
Modalità X:
'<,'>/'/" [RET]