Regex para combinar o início e o fim da linha no Vim (citação em torno da linha inteira)

2

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?

    
por user1717828 27.07.2017 / 20:07

4 respostas

5

Que tal:

:%s/.*/'&'/

"Substitua zero ou mais caracteres pelos caracteres precedidos e bem sucedidos por um aspas simples".

    
por 27.07.2017 / 20:18
2

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.

    
por 27.07.2017 / 20:17
2

^ 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.

    
por 08.09.2017 / 10:56
1

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.

    
por 27.07.2017 / 21:56