Como alterar os números à direita para incrementar o número

2

Estou usando o ArchLinux 4.1.6-1 e o bash 4.3.

Eu preciso arrumar uma pilha de programas em mais de 200 robôs industriais e, assim, tentar automatizar o trabalho das pernas.

Eu posso separar um arquivo para apenas uma lista de referências de coordenadas na mesma ordem do arquivo original com a mistura bash , sed , head , tail etc, assim:

via15
via25
via35
via3
via4
via5
p0584_62284
via43

Eu preciso alterar os números à direita nas linhas que contêm via para séries incrementadas de números começando em 1:

via1
via2
via3
via4
via5
via6
p0584_62284
via7

Sou um programador de robôs e posso gerenciar apenas sed regex simples, mas com awk , sou como um peixe em uma bicicleta.

    
por Jim 18.09.2015 / 23:47

1 resposta

5

$ awk '/via/{$0="via" ++n};1' file
via1
via2
via3
via4
via5
via6
p0584_62284
via7

Como funciona

  • /via/{$0="via" ++n}

    Se a linha contiver via , substitua por "via" seguido por n . O ++ principal faz com que n seja incrementado antes de cada vez que isso é feito. $0 é como o awk se refere à linha como um todo.

  • 1

    Esta é uma abreviada enigmática do awk para imprimir a linha.

    Em detalhes, 1 é uma condição e é avaliada como verdadeira. Como nenhuma ação é especificada, é executada a ação padrão que é imprimir a linha: print $0 . Assim, um único 1 é uma forma abreviada de imprimir a linha.

Abordagem mais seletiva

É possível que as três letras via apareçam nas linhas que não queremos alterar? Se assim for, devemos ser mais seletivos sobre quais linhas nós mudamos. Se quisermos alterar apenas as linhas que começam com via e nas quais via é seguido apenas por números, então, como sugerido por NeronLeVelu nos comentários, devemos usar um regex mais restritivo, como ^via[0-9]+$ . Nesse caso:

awk '/^via[0-9]+$/{$0="via" ++n};1' file
    
por 18.09.2015 / 23:58