원하는 변화

원하는 변화

나는 많은 다국어 텍스트 파일을 구문 분석하기 위해 Perl을 사용하고 있습니다. 두 가지 모드 간에 텍스트를 변경해야 합니다.

원하는 변화

예를 들어 원래 영어 버전은 다음과 같습니다.

\label{whatever}
\ref{whatever}
\autoref{whatever}

{그러나 와 사이의 내용에는 }적절한 ISO 639 언어 코드가 추가되어야 합니다.

\label{whatever_de}
\ref{whatever_de}
\autoref{whatever_de}

검정 가설

다음 파일이 제공됩니다.

da/myfile_da.tex
de/myfile_de.tex
el/myfile_el.tex
en/myfile_en.tex

각 파일에는 다음이 포함됩니다.

\label{some_nice_thing}
\ref{some_nice_thing}
\autoref{some_nice_thing}

내 방법

폴더 이름을 ISO 639 코드로 사용하고 간단한 파일 루프를 만들 수 있습니다. 다음은 변경된 줄을 터미널 콘솔에 간단히 인쇄해야 합니다. 나는 예를 들어 내가 얻는 특정 결과를 설명하려고 노력할 것입니다.

피복재:\\label\{.*?\}

for f in *; do  if [[ -d $f ]]; then perl -ne "print if s/(\\label\{.*?)\}/\1_$f\}/g"  $f/myfile_$f.tex; fi; done

작동 안함:\\ref\{.*?\}

for f in *; do  if [[ -d $f ]]; then perl -ne "print if s/(\\ref\{.*?)\}/\1_$f\}/g"  $f/myfile_$f.tex; fi; done

작동 안함:\\autoref\{.*?\}

for f in *; do  if [[ -d $f ]]; then perl -ne "print if s/(\\autoref\{.*?)\}/\1_$f\}/g"  $f/myfile_$f.tex; fi; done

모든 경우에 적용 grep -Pr됩니다(물론 그룹 제거).

답변1

\\\큰따옴표 로 묶습니다 . \\ref되고, 그 이후에는 \ref실제로 존재하게 됩니다. 4개의 백슬래시를 사용하십시오.\ref

for f in *; do
    if [[ -d $f ]]; then
        perl -ne "print if s/(\\\\ref\{.*?)\}/\1_$f\}/g" $f/SystemRequirements_$f.tex
    fi
done

마찬가지로 \aBELL 문자( )입니다 \x07.

답변2

인용 문제입니다. 변수에는 큰따옴표를 사용 $f하지만 큰따옴표에는 다른 의미가 있습니다. 특히 문자를 백슬래시로 이스케이프할 수 있으므로 Perl에 도달하면 \\다음과 같습니다.\

$ printf "%s\n" "print if s/(\\label\{.*?)\}/\1_$f\}/g"
print if s/(\label\{.*?)\}/\1_\}/g

이는 문자가 리턴으로 처리되기 r때문에 문제를 야기합니다 (참조:\rperlrebackslash) - 일치하지 않습니다 r. 대신 작은따옴표를 사용하고 변수에 대해서만 엽니다.

$ printf "%s\n" 'print if s/(\\label\{.*?)\}/\1_'"$f"'\}/g'
print if s/(\\label\{.*?)\}/\1_\}/g

관련 정보