중괄호 {}를 sed와 일치시킵니다.

중괄호 {}를 sed와 일치시킵니다.

아래 예와 같이 파일 이름 목록을 얻기 위해 파일 \includegraphics에서 제거 하고 싶습니다 . 삭제 하고 가져오고 .tex싶어요xyI

something {\includegraphics[width=0.5\textwidth]{/tmp/myfile.pdf} somethingelse
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIIIIIIIIIIIIIyyyyyyyyyyyyyyy

다음 예는 GNU sed 4.5에서는 작동하지 않습니다. 올바르게 일치하도록 중괄호를 어떻게 적절하게 이스케이프 처리해야 합니까?

echo "something {\includegraphics[width=0.5\textwidth]{" | sed -e "s/^*.\\includegraphics\[*.\]\{//"

답변1

도망치 {거나 하지 마세요 }. 그렇게 하면 sed정규식 반복 연산자를 사용하고 있다는 인상을 받게 됩니다(예: \{1,4\}이전 표현식을 1~4회 일치). 이는 기본 정규식 연산자이며 이에 상응하는 확장 정규식에는 백슬래시가 없습니다.

확장 정규식( 와 함께 사용 sed -E) 에서는하다{탈출 하고 싶고 }. 이러한 문자를 이스케이프해야 할 시기와 이스케이프하지 말아야 할 시기를 기억하기 어려운 경우 기본 표현식과 확장 표현식에서 언제든지 and를 사용하여 [{]문자 그대로 일치시킬 수 있습니다.[}]

당신은 또한 *.. 를 의미한다고 생각되는 두 곳에서 사용했습니다 .*. 그런데 *정규 표현식의 시작 부분(또는 바로 뒤)은 리터럴 문자 ^와 일치합니다 .*

실제 sed명령은 아마도 다음을 사용할 것입니다.

sed 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex

\includegraphics명령이 포함되지 않은 모든 줄을 제거하려면 간단한 d명령을 추가하면 됩니다.

sed -e '/\\includegraphics/!d' \
    -e 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex

이는 귀하의 예에서는 작동하지만 somethingelse줄 끝에 {문자가 있으면 아무런 효과가 없습니다 .

관련 정보