Substituindo certos comandos por parênteses / colchetes enquanto mantém o conteúdo (CLI)

1

Eu tenho um arquivo plain text com LaTeX comandos como \hspace{5cm} . Para converter esse arquivo em .odt , alguns dos meus comandos personalizados não são convertidos corretamente. Então, eu quero encontrar automaticamente & amp; substitua os comandos específicos , mas mantenha o conteúdo dos colchetes (o que significa que eu quero manter a maioria dos comandos e apenas excluir alguns). Eu sei que posso apenas abrir gedit e fazer a substituição manualmente, mas isso é para um script para substituição automática repetida.

Eu já pesquisei isso, mas até agora só encontrei respostas para excluir colchetes enquanto mantive o conteúdo (cf. aqui , aqui)). Também observei algumas introduções a sed (por exemplo, aqui ou aqui ) sem sucesso.

Exemplo:

This is my \textbf{text} where there are about \prc{5} commands, i.e. \mErrRange{30}{20}{m}.

Portanto, como esses são um percentual e um intervalo de erros, desejo excluir o comando & amp; chaves e obter algo parecido com isto (mantendo o comando \textbf{...} ):

This is my \textbf{text} where there are 5 % commands, i.e. 30 ± 20 m.

O que tentei até agora:

Várias maneiras de usar sed , como:

sed -i -e 's/\prc{\(.*\)}/%/g' hello.txt

Isso já me dá:

This is my \textbf{text} where there are about 5} commands, i.e. \mErrRange{30}{20}{m%.

(Substituindo a última chave na linha, mas deixando a outra em seu lugar.)

Então, agora não tenho ideia de como continuar com isso. Talvez eu deva usar outra ferramenta em vez de sed ?! Estou feliz com qualquer sugestão em execução no Ubuntu & amp; no terminal sem instalar muito.

    
por bamphe 05.02.2018 / 13:41

1 resposta

1

Aqui está uma maneira:

sed 's/\prc{\([^}]*\)}/ %/g'

Isto irá capturar tudo dentro dos parênteses após \prc e salvá-lo no grupo 1 , você pode usar isso para substituir o comando pelo conteúdo dos parênteses. [^}]* simplesmente leva tudo, exceto o colchete de fechamento aqui. g significa “globalmente” e significa que substituirá todas as ocorrências do padrão na linha em vez de apenas a primeira - você desejará isso para cada expressão no seu caso.

Quanto ao outro, basta usar vários grupos:

sed 's/\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/ ±  /g'

Você pode combinar quantas dessas expressões desejar, mas fica fácil de entender. Recomendo escrever um script sed com uma expressão por linha da seguinte forma:

#!/bin/sed -f
s/\prc{\([^}]*\)}/ %/g
s/\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/ ±  /g

Salvar como, por exemplo, script.sed , torne-o executável com chmod +x /path/to/script.sed e execute-o com /path/to/script.sed .

Exemplo de execução

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

Eu deixo o shell abrir arquivos de entrada o mais rápido possível, portanto <hello.txt ao invés de apenas hello.txt (que também funciona!). Se você está interessado em saber o que exatamente faz, eu recomendo esta resposta em unix.SE .

    
por dessert 05.02.2018 / 14:00