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 $title
sea 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 \title
bit 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 SOMETHING
subcadena. 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
, perl
o tex
él mismo.
Respuesta3
No intentaría hacer esto en el caparazón. Simplemente analice la salida grep
antes 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 -o
y -P
, puedes hacer:
title=$(grep -oP '\\title\{\K[^}]+' file.tex)