用增量模式替换字符串中每次出现的模式

Replace every occurrence of pattern in a string by an incremental pattern

我有很多这样的输入文件:

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

我想用 #1#2 替换 10087。所以这个想法是每次模式 )*: 匹配时 * 被增量字符串替换:#1,#2...

到目前为止我唯一想出的是这个 perl 单行代码:perl -ple 's/\)*\:/\)$n++\:/g' file 但它给出了以下输出:

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

我看不出我哪里错了。

任何 bashperl(或其他!)脚本将不胜感激!

谢谢!

您很接近:您需要将替换文本计算为 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
$ 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