sed '/^<@\([^|]*\)\(.*\)>/!b
s//\autocite{}/
s/|/[/;s/|/][/g;/\[/s/{/]{/
' <<\DATA
<@sample>
<@sample|12>
<@sample|12|c.>
DATA
OUTPUT
\autocite{sample}
\autocite[12]{sample}
\autocite[12][c.]{sample}
A primeira coisa que o sed faz é verificar se a linha em que está trabalhando começa com <@ seguido em algum ponto por > . Se a linha não corresponder a esse padrão, b sairá do script para começar o próximo ciclo de linha e tentar novamente.
Mas se ele corresponder a sed , ele fará referência a com todos ou alguns caracteres seguindo @ , que não são do caractere | e referenciando com todos ou qualquer caractere seguinte a primeira sequência até a última ocorrência de > na linha. Na próxima linha - que só é alcançada se a primeira linha corresponder - sed toma emprestadas essas referências do primeiro endereço e substitui a string inteira por \autocite{} .
Na linha seguinte, sed tenta substituir a primeira ocorrência do caractere | por [ , depois mais | caracteres com ][ e, por último, se existe [ na linha substitui a primeira ocorrência de { com ]{ .
Tudo que o sed faz é simples. Tudo que o sed faz é um resultado direto da coisa que acabou de fazer. sed é conspicuamente - e às vezes irritantemente - ordenado.
E, a propósito, isso deve lidar com tantos | de parâmetros separados quanto você poderia especificar em uma única linha - não está limitado a dois. Os [<>@|{}] tokens e o posicionamento de linha devem ser respeitados - pelo menos como estão escritos. Contanto que você siga as regras, sed certamente não quebrará nenhum.