Substitui uma palavra após a palavra combinada com valores incrementais

3

Eu tenho um arquivo como este -

   !
   interface csa2549abA
   xxxx
   yyyy
   zzzz
   !
   interface aso23apwoeAe
   aaa
   bbb
   ccc
   !
   interface FastEthernet0/1
   ppp
   qqq
   rrr
   !

e assim por diante.

O que eu quero é renomear o interfaces que se parece com hashes para algo mais coerente, mas não o que faz sentido e fazer o resultado como este. A principal diferença entre os que fazem sentido e os que não o fazem é que os que são hashes têm números entre o nome. Aqueles que fazem sentido sempre terminam com números. A saída deve ficar assim -

   !
   interface ethernet1
   xxxx
   yyyy
   zzzz
   !
   interface ethernet2
   aaa
   bbb
   ccc
   !
   interface FastEthernet0/1
   ppp
   qqq
   rrr
   !

e assim por diante. Cada interface é apenas um incremento nos valores do termo ethernet . Suponha também que existem vários arquivos de cada tipo, que podem ser tomados como entrada.

O que eu tenho agora é sed -i 's/^interface .*$/interface Ethernet/' * , mas isso apenas substitui os valores de cada valor de interface por Ethernet. Eu queria saber se havia um comando para apenas incrementar a última parte de Ethernet para representar algo como eu quero.

    
por Zzrot 04.05.2016 / 04:23

1 resposta

4

Como a aritmética é necessária, sed não é a ferramenta certa. A solução abaixo usa awk .

Responda a pergunta revisada

Você diz que os hashes indesejados sempre têm nomes que incluem um número seguido por uma letra. Nesse caso:

$ awk '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!
interface FastEthernet0/1
ppp
qqq
rrr
!

Como funciona:

  • /^interface .*[[:digit:]][[:alpha:]]/

    Isso seleciona apenas as linhas que começam com interface e que também incluem um número seguido por uma letra.

  • $0="interface ethernet" ++f

    As linhas selecionadas como acima são alteradas para interface ethernet e um número e o número é incrementado a cada vez.

  • 1

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

Para alterar o arquivo no local, supondo que você esteja usando um moderno GNU awk, use:

awk -i inplace '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1

Responda para a pergunta original

$ awk '/^interface /{$0="interface ethernet" ++f} 1' file
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!

Para mudar o arquivo no local e assumir um moderno GNU awk, use:

awk -i inplace '/^interface /{$0="interface ethernet" ++f} 1' file
    
por 04.05.2016 / 04:28