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것이 perl좋습니다 tex.

답변3

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

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

또는

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

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

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

관련 정보