No Vim como apagar todas as palavras e caracteres que não combinem com um padrão

4

Eu pesquisei isso várias vezes ao longo dos anos e não encontrei uma boa solução, por isso estou desistindo e pedindo.

Eu quero poder excluir todas as palavras e pontuações que não correspondem a um padrão.

Então diga que eu tenho essa lista

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1

Eu quero remover tudo, MAS bwrb. * 471, [0-9] para que eu fique com

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1

Existe um comando VIM fácil que pode realizar?

obrigado.

    
por 7null 01.03.2013 / 21:03

3 respostas

11
:%s/\v(.*)(bwrb.*471,\d)(.*)/

faz o que você quer com sua amostra. Provavelmente, precisará ser alterado se as necessidades do mundo real forem mais complexas.

Basicamente, o padrão corresponde à linha inteira, mas usamos o agrupamento para separar o que queremos daquilo que não queremos. Recebemos três grupos, "antes do que queremos", "o que queremos", "depois do que queremos" e substituímos a linha inteira pelo segundo grupo, anotamos .

Passo a passo:

  • %s/

    A substituição é feita no arquivo inteiro.

  • \v

    O sinalizador "muito mágico" é útil para limitar o número de barras invertidas e melhorar a legibilidade.

  • (.*)

    O primeiro grupo contém qualquer número de qualquer caractere. A ancoragem ao início da linha está implícita, de modo que corresponde ao que quer que seja antes do que você deseja. Seria \(.*\) sem a bandeira "muito mágica".

  • (bwrb.*471,\d)

    Este é o segundo grupo: o seu padrão. A única coisa que eu mudei foi [0-9] , que substituí com o equivalente, mas mais curto, \d .

  • (.*)

    O terceiro grupo contém qualquer número de qualquer caractere até o final da linha.

  • /

    A peça de reposição consiste apenas no segundo grupo.

por 01.03.2013 / 21:45
2

Eu usaria este comando:

%s/.*\(BWRB.*471,[0-9]\).*/

% : aplica o comando a todas as linhas do arquivo.

s/pattern/replacement/ : comando de substituição como uso com sed :

  • .* corresponde a qualquer caractere até que uma substring correspondente a \(BWRB.*471,[0-9]\) seja encontrada. Quaisquer caracteres após a substring são correspondidos por .* . Os parênteses instruem vi para salvar a substring.

  • A substituição imprime a subsequência salva anteriormente, o que na verdade remove os caracteres indesejados da linha.

Por exemplo, este arquivo (que é seu exemplo ligeiramente modificado):

R61,1,BWRBW0471,2
R14,1,BWRBW0471,5
R162,1,BWRBN0471,0
R61 ,1,BWRBN0471,4
R61 ,1,BWRBN0471,1
R61 ,1,BWRBN0766471,1

é convertido para:

BWRBW0471,2
BWRBW0471,5
BWRBN0471,0
BWRBN0471,4
BWRBN0471,1
BWRBN0766471,1
    
por 01.03.2013 / 21:30
1

Eu não tenho certeza de quanta variabilidade há antes de suas strings, mas parece que você quer apenas um simples "substituir até BWRB em cada linha".

:% s /.* \ zeBWRB // g

    
por 01.03.2013 / 21:39

Tags