Bash에서 문자열 작업에 중괄호 사용

Bash에서 문자열 작업에 중괄호 사용

라텍스 파일의 문자열이 있는데 이를 처리하고 싶습니다.

\title{This is the 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와 같은 파일에서 데이터를 추출하고 구문 분석하는 데 더 적합한 도구를 사용하는 것이 좋습니다 .perltex

답변3

나는 쉘에서 이것을 시도하지 않을 것입니다. grep변수에 저장하기 전에 출력을 구문 분석 하세요 .

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

또는

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

또는 GNU 또는 sum 을 지원하는 grep다른 구현이 있는 경우 다음을 수행할 수 있습니다.-o-P

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

관련 정보