작업하고 싶은 라텍스 파일의 문자열이 있습니다.
\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)