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$1e 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.