Que tal:
:%s/.*/'&'/
"Substitua zero ou mais caracteres pelos caracteres precedidos e bem sucedidos por um aspas simples".
Para um arquivo inicial com linhas como este exemplo:
1
12
123
1234
12345
O estado desejado do arquivo é
'1'
'12'
'123'
'1234'
'12345'
Eu tenho feito isso com dois comandos, :%s/^/'/g
e :%s/$/'/g
, que eu gostaria de colocar em um. No entanto, quando tento
:%s/[$^]/'/g
Eu recebo o erro
E486: Pattern not found: [$^]
Eu sei que o ^
entre parênteses significa exclusão, então eu achei que colocar $
primeiro significaria corresponder tanto ao começo quanto ao fim das linhas, o que obviamente não está acontecendo.
Como posso combinar tanto o começo como o fim das linhas no vim?
Você realmente não precisa combinar o começo e o fim da linha se puder combinar tudo com avidez:
:%s/\(.*\)/''/
A principal coisa a saber é escapar dos parênteses para criar o "grupo de captura", então use para se referir ao que foi capturado.
^
e $
não contêm esses significados (início ou fim de linha) dentro de [ ]
, que é usado para selecionar um grupo de caracteres. Dentro de [ ]
, a maioria dos operadores regex perdem seu significado (e alguns caracteres ganham significado especial, ou obtêm um significado diferente). Um ^
em []
líder significa que o grupo é negado - corresponde a tudo exceto esses caracteres. Então, [^$]
corresponde a qualquer caractere diferente de $
. (E [$^]
corresponde apenas aos caracteres $
e ^
.)
Se você quer combinar o começo ou fim de uma linha, use /^\|$/
, onde |
é ou (precisa ser escapado no regex padrão do Vim modo).
Então:
:%s/^\|$/'/g
O g
é necessário, uma vez que ^
e $
são duas correspondências independentes e s
, por padrão, só atua na primeira correspondência em uma linha.
Com o comando norm[al]
e A
para anexar controle, I
para pré-definir o controle, o comando :exe[cute]
para executar a segunda norma 'prepend', porque por padrão o comando :norm[al]
não pode ser seguido por outro comando como em :help :normal
documentado.
então o comando seria o seguinte:
:exe "%norm A'" |%norm I'
Observe que %
aqui está realizando as alterações em todas as linhas.