/ / Substitua toda ocorrência de padrão em uma string por um padrão incremental - bash, perl, sed, increment

Substitua cada ocorrência de padrão em uma string por um padrão incremental - bash, perl, sed, increment

Eu tenho muitos arquivos de entrada como este:

(((A:1,B:2)100:4,C:5)87:4,D:3);

Eu quero substituir 100 e 87 de #1 e #2. Então a ideia é que toda vez que o padrão )*: corresponde a * é substituído por uma sequência incremental: #1,#2...

A única coisa que eu descobri até agora é este one-liner perl: perl -ple "s/)*:/)$n++:/g" file mas fornece a seguinte saída:

(((A)++:1,B)++:2)100)++:4,C)++:5)87)++:4,D)++:3);

e eu não consigo ver onde estou errado.

Qualquer bash ou perl (ou outro!) script seria muito apreciado!

Obrigado!

Respostas:

1 para resposta № 1

Você estava perto: você precisa avaliar o texto de substituição como uma expressão perl:

perl -pe "s/).*?:/ ")#" . ++$n . ":" /ge" file
(((A:1,B:2)#1:4,C:5)#2:4,D:3);

Ou, com olhares em volta

perl -pe "s/(?<=)).*?(?=:)/ "#" . ++$n /ge" file

1 para resposta № 2
$ awk "{ while( sub(/)[0-9]+/,")#"++i) ); }1" file
(((A:1,B:2)#1:4,C:5)#2:4,D:3);

Aparentemente, o nawk exige que a chave aberta no RE seja escapada:

$ awk "{ while( sub(/)[0-9]+/,")#"++i) ); }1" file