One-liner Perl:
perl -pe's/\[gene=([^\]]*)\K\]/$h{$1}++?"$h{$1}]":"]"/e' yourfile
Explicado:
-
-p
: executa o código para cada linha do arquivo (armazenada em$_
) e imprime$_
no final. -
-e
: code. -
s/regex/replacement/e
: combine regex e substitua por substituição em$_
.
O regex:
/\[gene= # match [gene=
([^\]]*) # match anything but "]" and put it a matching group
\K # don't “take” anything until here
\] # match a literal ]
/x
A substituição:
-
condition ? yes : no
: operador ternário clássico (leia um if com retorno) -
$h{$1}++
: armazena o conteúdo do primeiro grupo correspondente em um hash (dictonary, mapping…) e aumenta o valor em um. Retorna0
, o que é falso no primeiro encontro. -
"$h{$1}]"
: leia o valor de$1
e interpole-o em uma string.
Se você quiser a substituição no arquivo, adicione um -i
após o perl
. Você pode fornecer um arquivo opcional que termina para um arquivo de backup no sinalizador -i
(por exemplo perl -i'.bak' -pe'…' yourfile
changes yourfile
e cria um yourfile.bak
antes da substituição.