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.