Removendo tags LaTeX aninhadas com o Regex

1

Como eu usaria regex (como com sed ) para remover todas as tags \index que ocorrem dentro de qualquer tag \index ?

Por exemplo, uma confusão aninhada assim:

\index{Test\index{test\index{test}}ing One\index{one} Two\index{two} Three\index{three}}

se transformaria em

\index{Testing One Two Three}

obrigado

    
por Geremia 07.05.2014 / 07:27

2 respostas

2

Você pode usar um loop. O seguinte removeria \index{foo} desde que seja precedido por um limite de palavras.

sed -r ':a;s/\b\index\{[^{}]+}//;ta' inputfile

Para sua amostra, ele produziria:

\index{Testing One Two Three}

No entanto, esteja avisado sobre o uso de expressões regulares para analisar e manipular esses padrões aninhados. Caso isso aconteça, certifique-se de observar o diff da entrada antes e depois da alteração.

EDIT: Explicação:

Veja primeiro o comando de substituição:

s/\b\index\{[^{}]+}//g
  • \b corresponde a um limite entre um caractere de palavra \w e um caractere não de palavra \W .
  • \index\{ corresponde a \index{
  • [^{}]+} corresponde a um ou mais de qualquer coisa que não seja } seguido por }

:a é um rótulo. ta ramifica para rotular a se a substituição foi bem sucedida.

Portanto, funcionaria removendo o mais interno index{} da string, de tal forma que

\index{Test\index{test\index{test}}ing One\index{one} Two\index{two} Three\index{three}}

se transformaria em:

\index{Test\index{test}ing One\index{one} Two\index{two} Three\index{three}}

e assim por diante até a substituição falhar.

    
por 07.05.2014 / 07:52
1

As seguintes obras onde quer que \ index esteja localizado,

 sed -e 's/\index{\([^]]*\)}/\index{}/g' inputfile

exceto .... que funciona desde que as chaves de abertura e fechamento estejam localizadas na mesma linha . sed tem várias opções (P, N, D) para lidar com padrões que terminam em várias linhas, mas funcionam concatenando duas linhas consecutivas. Como é possível que o padrão {} das chaves se feche em linhas 3,4, .., n, ..., isso exigirá alguma programação.

Alternativamente, se você está satisfeito com apenas localizar padrões de correspondência ( isto é, , não substituindo-os), você pode usar:

pcregrep -M '\{(\s*.*\s*)*\}' test.txt

onde a opção -M é usada para permitir padrões Multiline . Isso encontra zero ou mais ocorrências de (espaços em branco seguidos por. * Seguidos por espaço em branco), desde que tudo isso esteja cercado por chaves.

    
por 07.05.2014 / 16:15

Tags