/ / Reemplace cada aparición de patrón en una cadena por un patrón incremental: bash, perl, sed, incremento

Reemplace cada aparición del patrón en una cadena por un patrón incremental - bash, perl, sed, increment

Tengo muchos archivos de entrada como este:

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

Quiero reemplazar 100 y 87 por #1 y #2. Entonces la idea es que cada vez que el patrón )*: se corresponde con el * se reemplaza por una cadena incremental: #1,#2...

Lo único que he descubierto hasta ahora es este perl one-liner: perl -ple "s/)*:/)$n++:/g" file pero da el siguiente resultado:

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

y no puedo ver dónde estoy equivocado.

Alguna bash o perl (¡u otro!) ¡el guión sería muy apreciado!

¡Gracias!

Respuestas

1 para la respuesta № 1

Estuviste cerca: debes evaluar el texto de reemplazo como una expresión perl:

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

O, con miradas

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

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

Aparentemente, nawk requiere que se escape la llave abierta en el RE:

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