У меня есть строка из файла latex, над которой я хотел бы поработать:
\title{This is the title}
Я хотел бы сохранить «Это заголовок» в переменной, но не могу удалить подстроки с фигурными скобками, несмотря на мои попытки экранировать их.
title=`grep -F "\title" file.tex`
title=${title#\}}
title=${title%\{}
Ни один из этих способов не работает, как и помещение фигурных скобок в одинарные или двойные кавычки.
решение1
Предположим, что $title
это строка \title{This is the title}
:
title=${title#*{}
title=${title%\}}
В первом параметре подстановку {
не нужно экранировать (хотя экранирование не сделает ее неработоспособной), но во }
втором параметре экранирование необходимо. В первом параметре вам дополнительно нужно *
сопоставить \title
бит в строке, в качестве альтернативы используйте ${title#\\title{}
для удаления явной строки \title{
.
Похоже, вы перепутали %
и #
в своем коде и забыли *
в подстановке, которая удаляет префиксную строку.
Если предположить, что ни одна строка заголовка не занимает более одной строки, вы можете извлечь все эти строки из документа с помощью
sed -n 's/.*\\title{\([^}]*\)}.*/\1/p' file
Это соответствует (первому) \title{SOMETHING}
в каждой строке и заменяет всю строку подстрокой SOMETHING
. Все остальные данные отбрасываются.
решение2
Если вы используете bash, вы можете вместо этого воспользоваться его возможностями регулярных выражений:
title='\title{This is the title}'
[[ $title =~ \{(.*)\} ]] && title=${BASH_REMATCH[1]}
echo "title=$title"
title=This is the title
Это, если вам действительно нужно сделать это в bash. Если это происходит из файла, вам лучше использовать инструменты, которые лучше подходят для извлечения и анализа данных из файлов, например grep
, , awk
, perl
, или tex
сам по себе.
решение3
Я бы не стал пытаться делать это в оболочке. Просто проанализируйте вывод grep
перед сохранением в переменной:
title=$(grep -F '\title' file.tex | sed s'/.*{\(.*\)}/\1/')
или
title=$(grep -F '\title' file.tex | awk -F'[{}]' '{print $2}')
Или, если у вас есть GNU grep
или любая другая реализация, поддерживающая -o
и -P
, вы можете сделать следующее:
title=$(grep -oP '\\title\{\K[^}]+' file.tex)