Manipulación de cadenas con llaves en bash

Manipulación de cadenas con llaves en bash

Tengo una cadena de un archivo de látex en el que me gustaría trabajar:

\title{This is the title}

Me gustaría guardar "Este es el título" en una variable, pero no puedo eliminar las subcadenas con llaves, a pesar de mis intentos de escapar de ellas.

title=`grep -F "\title" file.tex`
title=${title#\}}
title=${title%\{}

Ninguno de estos funciona, y poner las llaves entre comillas simples o dobles tampoco funciona.

Respuesta1

Suponiendo que esa $titlesea la cadena \title{This is the title}:

title=${title#*{}
title=${title%\}}

No es necesario escapar de {la sustitución del primer parámetro (aunque escapar no hará que no funcione), pero }es necesario escapar de la del segundo. En el primero, también debe *hacer coincidir el \titlebit de la cadena; alternativamente, utilícelo ${title#\\title{}para eliminar la cadena explícita \title{.

Parece que confundiste %y #en tu código y lo olvidaste *en la sustitución que elimina la cadena de prefijo.


Suponiendo que ninguna cadena de título abarque más de una sola línea, puede obtener todas esas cadenas de un documento con

sed -n 's/.*\\title{\([^}]*\)}.*/\1/p' file

Esto coincide (el primero) \title{SOMETHING}en cada línea y reemplaza toda la línea con la SOMETHINGsubcadena. Todos los demás datos se descartan.

Respuesta2

Si estás usando bash, puedes usar sus funciones de expresiones regulares en su lugar:

title='\title{This is the title}'
[[ $title =~ \{(.*)\} ]] && title=${BASH_REMATCH[1]}
echo "title=$title"

title=This is the title

Eso es, suponiendo que realmente necesites hacer esto en bash. Si eso proviene de un archivo, será mejor que utilice herramientas más adecuadas para extraer y analizar datos de archivos, como grep, awk, perlo texél mismo.

Respuesta3

No intentaría hacer esto en el caparazón. Simplemente analice la salida grepantes de guardar en una variable:

title=$(grep -F '\title' file.tex | sed s'/.*{\(.*\)}/\1/')

o

title=$(grep -F '\title' file.tex | awk -F'[{}]' '{print $2}')

O, si tienes GNU grep, o cualquier otra implementación que admita -oy -P, puedes hacer:

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

información relacionada