Имам много входни файлове като този:
(((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