원하는 변경

원하는 변경

나는 많은 다국어 텍스트 파일을 구문 분석하기 위해 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됩니다 . 4개의 백슬래시를 사용하십시오.\ref\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

관련 정보