我有很多像这样的输入文件:
(((A:1,B:2)100:4,C:5)87:4,D:3);
我想要100
和87
替换#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);
我无法看到我错在哪里。
非常感谢任何bash
或perl
(或其他!)脚本!
谢谢!
答案 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