Substitua os parênteses correspondentes pelo conteúdo incluído

4

O que é uma maneira simples de encontrar pares de parênteses consecutivos correspondentes e substituí-los por seu conteúdo delimitado usando sed / awk no bash?

Um exemplo mínimo seria:

Entrada:

(body1)

Saída:

body1

Solução insuficiente:

Isso pode ser feito com

echo "(body1)" | sed 's/[()]//g'

Problema estendido

Mas simplesmente remover todos os parênteses de abertura / fechamento não será suficiente, já que o objetivo final é remover certos comandos, não todos (tex) de um arquivo de origem, como

Entrada:

Alea {\color{red}iacta} est. \textbf{Hic} forum est, populus {\color{red}properant}.

Saída:

Alea iacta est. \textbf{Hic} forum est, populus properant.

Até agora consegui apenas extrair o texto com:

awk -v FS="({\color{red}|})" '{print $2}' $file.tex

Bônus

com sed -E 's/\{\color\{red}([^{}]*)\}//g' é possível remover apenas o comando \ color {red} - no entanto, o início e o fim do comando precisam estar na mesma linha.

Como remover um comando que abrange várias linhas antes do parêntese de fechamento } ?

Solução Bônus

Se alguém estiver interessado, os seguintes comandos parecem resolver o problema do bônus: sed -i -r 's#\{\color\{red\}([^}]*)\}##g' $file.tex sed -i -r ':a;N;$!ba;s#\{\color\{red\}([^}]*)\}##' $file.tex

O primeiro comando remove todos os pares de {\color{red} e } em uma única linha. O segundo comando remove todos os pares que abrangem várias linhas.

    
por Oscillon 15.02.2017 / 10:23

1 resposta

0

Até mesmo a simples pergunta que você está começando esconde alguma complexidade. Eu começaria com

sed -E 's/\(([^()]*)\)//'

repetido até que não haja parênteses pares . Isso substitui o texto mais interno:

$ echo "((body))" | sed -E 's/\(([^()]*)\)//'
(body)

Como sugerido por Kusalananda no entanto, para eliminar os comandos do TeX, você deve verificar detex que está disponível em TeX Live (e na maioria das distribuições). Esse processamento exige mais do que parênteses ou chaves correspondentes: você precisa saber um pouco sobre o comportamento de vários comandos. Mesmo no seu exemplo, \color precisa ser processado de uma forma, \textbf outra ...

    
por 15.02.2017 / 10:30