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 № 1Estuviste 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