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