Encontre todas as ocorrências de 5 dígitos após o decimal, adicione um dígito

4

Eu tenho um arquivo de números .txt separados por espaços:

40.766375 -84.267443
40.766355 -84.267463
40.766325 -84.263443
...

Ocasionalmente, há um número na primeira coluna que não tem 6 dígitos após o decimal:

40.76632 -84.263443

Eu quero inserir um 0 no final de cada ocorrência, de modo que acabe com:

40.766320 -84.263443

Existem muitas linhas (acima de 36000), então eu gostaria de fazer isso com regex. Alguma idéia?

EDIT: Eu acho que preciso de algo como %código% mas eu não consigo chegar lá.

    
por StatsSorceress 28.02.2017 / 15:00

2 respostas

2
:%s/\(\.\d\{5\}\) / /

Isso pode fazer o que você quiser.

Explicação

Com \(\.\d{5\}\) , capturamos a primeira ocorrência de pontos ( \. ) e cinco dígitos ( \d\{5\} ). Além disso, verificamos que há exatamente cinco deles, deixando o espaço após o grupo de captura.

Na segunda parte da substituição, estamos usando para obter acesso ao primeiro (e uma vez) grupo de captura, colocar 0 após ele e colocar um espaço no final, porque o espaço foi correspondido por regexp, mas não transferido para a segunda parte.

Um pouco sobre os grupos de captura: é exatamente «grupo de captura número um e zero depois dele». Assim, você pode ter acesso a apenas oito grupos.

    
por 28.02.2017 / 15:21
1

Como uma forma mais geral de forçar todos os números a ter 6 dígitos após o período, você poderia:

:%s/\.\d\+/&00000/g
:%s/\.\d\{6}\zs\d*//g

O primeiro adiciona 5 zeros e o segundo remove todos, exceto os 6 primeiros dígitos após o período. \zs é vim equivalente a perl \K que redefine o início da parte correspondente.

Você também pode fazer coisas como:

 :%s/\d\+\.\d\+/\=printf("%.6f", str2float(submatch(0)))/g
    
por 28.02.2017 / 15:58