用增量模式替换字符串中每次出现的模式
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
替换 100
和 87
。所以这个想法是每次模式 )*:
匹配时 *
被增量字符串替换:#1
,#2
...
到目前为止我唯一想出的是这个 perl 单行代码:perl -ple 's/\)*\:/\)$n++\:/g' file
但它给出了以下输出:
(((A)++:1,B)++:2)100)++:4,C)++:5)87)++:4,D)++:3);
我看不出我哪里错了。
任何 bash
或 perl
(或其他!)脚本将不胜感激!
谢谢!
您很接近:您需要将替换文本计算为 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
我有很多这样的输入文件:
(((A:1,B:2)100:4,C:5)87:4,D:3);
我想用 #1
和 #2
替换 100
和 87
。所以这个想法是每次模式 )*:
匹配时 *
被增量字符串替换:#1
,#2
...
到目前为止我唯一想出的是这个 perl 单行代码:perl -ple 's/\)*\:/\)$n++\:/g' file
但它给出了以下输出:
(((A)++:1,B)++:2)100)++:4,C)++:5)87)++:4,D)++:3);
我看不出我哪里错了。
任何 bash
或 perl
(或其他!)脚本将不胜感激!
谢谢!
您很接近:您需要将替换文本计算为 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