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

时间:2015-04-07 16:56:14

标签: bash perl sed increment

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

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

我想要10087替换#1#2。因此,我们的想法是,每次匹配模式)*:时,*都会被增量字符串替换:#1#2 ......

我到目前为止唯一想到的是perl one-liner:perl -ple 's/\)*\:/\)$n++\:/g' file,但它提供了以下输出:

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

我无法看到我错在哪里。

非常感谢任何bashperl(或其他!)脚本!

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

$ 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