Transformar tags personalizadas com argumentos

1

Eu quero escrever minhas teses de diploma com o markdown. Infelizmente, não há editor perfeito e tenho que improvisar. Para citações bibtex eu quero transformar minha própria definição com algum tipo de bash-filter antes de manipular a entrada para pandoc:

<@BIBTEX_ID[|OPTIONAL_PAGE_OR_CHAPTER_NUM[|OPTIONAL_UNIT_DEFINITION]]>

para algo como:

\autocite[OPTIONAL_UNIT_DEFINITION][OPTIONAL_PAGE_OR_CHAPTER_NUM]{BIBTEX_ID}

exemplo:

<@sample>       ---> \autocite{sample}
<@sample|12>    ---> \autocite[12]{sample}
<@sample|12|c.> ---> \autocite[12][c.]{sample}

qual ferramenta bash / unix pode fazer este trabalho? Seria possível fazê-lo com sed ou awk?

    
por NaN 20.08.2014 / 08:54

2 respostas

2

Você pode usar sed para isso diretamente:

sed -e 's/<@\([^|>]*\)|\([^|>]*\)|\([^>|]*\)>/\autocite[][]{}/g' \
    -e 's/<@\([^|>]*\)|\([^|>]*\)>/\autocite[]{}/g' \
    -e 's/<@\([^|>]*\)>/\autocite{}/g'

Isto apenas substitui cada formulação possível separadamente: a primeira trata citações de três parâmetros, depois duas, depois uma. Cada bloco opcional é correspondido com \([^|>]*\) e eles são substituídos na saída com ...3 .

    
por 20.08.2014 / 09:02
1
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.

    
por 20.08.2014 / 10:09