/ / Заменете всяко появяване на шаблон в низ с инкрементален шаблон - bash, perl, sed, increment

Замяна на всеки случай на шаблон в низ с инкрементален модел - bash, perl, sed, increment

Имам много входни файлове като този:

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

Искам да го заместя 100 и 87 от #1 и #2, Така че идеята е, че всеки път моделът )*: съвпада с * се заменя с инкрементален низ: #1,#2...

Единственото нещо, което досега измислих, е този perl един лайнер: perl -ple "s/)*:/)$n++:/g" file но той дава следния изход:

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

и не мога да видя къде греша.

който и да е bash или perl (или друг!) Сценарий ще бъде много оценявам!

Благодаря!

Отговори:

1 за отговор № 1

Бяхте близо: трябва да оцените заместващия текст като perl израз:

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

Или с поглед

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

1 за отговор № 2
$ awk "{ while( sub(/)[0-9]+/,")#"++i) ); }1" file
(((A:1,B:2)#1:4,C:5)#2:4,D:3);

Очевидно nawk изисква отворената скоба в RE да се избягва:

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