Manipulação de strings com colchetes no bash

Manipulação de strings com colchetes no bash

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 $titleseja 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 \titlebit 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 SOMETHINGsubstring. 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, perlou texele mesmo.

Responder3

Eu não tentaria fazer isso no shell. Basta analisar a saída de grepantes 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 grepou qualquer outra implementação que suporte -oe -P, você pode fazer:

title=$(grep -oP '\\title\{\K[^}]+' file.tex)

informação relacionada