Eu tenho uma string de um arquivo látex que gostaria de trabalhar:
\title{This is the title}
Gostaria de salvar "Este é o título" em uma variável, mas não consigo remover as substrings com chaves, apesar de minhas tentativas de escapar delas.
title=`grep -F "\title" file.tex`
title=${title#\}}
title=${title%\{}
Nenhum deles funciona, e colocar as chaves entre aspas simples ou duplas também não funciona.
Responder1
Supondo que essa $title
seja a string \title{This is the title}
:
title=${title#*{}
title=${title%\}}
A {
substituição do primeiro parâmetro não precisa ser escapada (escapá-la não fará com que não funcione), mas a }
do segundo precisa escapar. No primeiro, você também precisa *
combinar o \title
bit na string, alternativamente usar ${title#\\title{}
para excluir a string explícita \title{
.
Você parece confundir o %
e #
no seu código e esqueceu o *
na substituição que remove a string do prefixo.
Supondo que nenhuma sequência de título abranja mais do que uma única linha, você pode obter todas essas sequências de um documento com
sed -n 's/.*\\title{\([^}]*\)}.*/\1/p' file
Isso corresponde (ao primeiro) \title{SOMETHING}
em cada linha e substitui a linha inteira pela SOMETHING
substring. Todos os outros dados são descartados.
Responder2
Se você estiver usando o bash, poderá usar seus recursos de regex:
title='\title{This is the title}'
[[ $title =~ \{(.*)\} ]] && title=${BASH_REMATCH[1]}
echo "title=$title"
title=This is the title
Isto é, supondo que você realmente precise fazer isso no bash. Se esse material vier de um arquivo, é melhor usar ferramentas mais adequadas para extrair e analisar dados de arquivos, como grep
, awk
, perl
ou tex
ele mesmo.
Responder3
Eu não tentaria fazer isso no shell. Basta analisar a saída de grep
antes de salvar em uma variável:
title=$(grep -F '\title' file.tex | sed s'/.*{\(.*\)}/\1/')
ou
title=$(grep -F '\title' file.tex | awk -F'[{}]' '{print $2}')
Ou, se você tiver GNU grep
ou qualquer outra implementação que suporte -o
e -P
, você pode fazer:
title=$(grep -oP '\\title\{\K[^}]+' file.tex)