Манипулирование строками с помощью фигурных скобок в bash

Манипулирование строками с помощью фигурных скобок в bash

У меня есть строка из файла 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)

Связанный контент