![Bash에서 문자열 작업에 중괄호 사용](https://linux55.com/image/170591/Bash%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%9E%91%EC%97%85%EC%97%90%20%EC%A4%91%EA%B4%84%ED%98%B8%20%EC%82%AC%EC%9A%A9.png)
라텍스 파일의 문자열이 있는데 이를 처리하고 싶습니다.
\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 또는 sum 을 지원하는 grep
다른 구현이 있는 경우 다음을 수행할 수 있습니다.-o
-P
title=$(grep -oP '\\title\{\K[^}]+' file.tex)