refere-se ao primeiro grupo entre parênteses, mas você não tem nenhum.
Adicione os parênteses ou use
&
para preencher toda a string correspondente:
$ echo "foobar" | sed -e 's/foo/&ABC/'
fooABCbar
$ echo "foobar" | sed -re 's/(foo)/ABC/'
fooABCbar
Observe que você precisa de -r
no GNU sed para usar os parênteses e também com a correspondência de contagem {NN}
. (a menos que você queira usar as barras invertidas feias em todos eles).
Então:
echo "0020000000000000100000000000000000000000000001" | sed -re 's/([0-9a-z]{45})//g'
00200000000000001000000000000000000000000000091
Essa sequência de dígitos tem 46 caracteres, mas o regex corresponde apenas a 45 caracteres, portanto, o nove é adicionado antes do último dígito. Ancore o regexp para o início e o fim da linha, se desejar processar apenas linhas com exatamente 45 caracteres.
$ echo "002000000000000010000000000000000000000000001" | sed -re 's/^[0-9a-z]{45}$/&9/g'
0020000000000000100000000000000000000000000019
(Eu mudei o número adicionado a um nove para que ele não se misturasse com os zeros na entrada).