Eu tenho muitos arquivos de entrada como este:
(((A:1,B:2)100:4,C:5)87:4,D:3);
Eu quero substituir 100
e 87
de #1
e #2
. Então a ideia é que toda vez que o padrão )*:
corresponde a *
é substituído por uma sequência incremental: #1
,#2
...
A única coisa que eu descobri até agora é este one-liner perl: perl -ple "s/)*:/)$n++:/g" file
mas fornece a seguinte saída:
(((A)++:1,B)++:2)100)++:4,C)++:5)87)++:4,D)++:3);
e eu não consigo ver onde estou errado.
Qualquer bash
ou perl
(ou outro!) script seria muito apreciado!
Obrigado!
Respostas:
1 para resposta № 1Você estava perto: você precisa avaliar o texto de substituição como uma expressão perl:
perl -pe "s/).*?:/ ")#" . ++$n . ":" /ge" file
(((A:1,B:2)#1:4,C:5)#2:4,D:3);
Ou, com olhares em volta
perl -pe "s/(?<=)).*?(?=:)/ "#" . ++$n /ge" file
1 para resposta № 2
$ awk "{ while( sub(/)[0-9]+/,")#"++i) ); }1" file
(((A:1,B:2)#1:4,C:5)#2:4,D:3);
Aparentemente, o nawk exige que a chave aberta no RE seja escapada:
$ awk "{ while( sub(/)[0-9]+/,")#"++i) ); }1" file