나는 많은 다국어 텍스트 파일을 구문 분석하기 위해 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개의 백슬래시를 사용하십시오.\r
ef
for f in *; do
if [[ -d $f ]]; then
perl -ne "print if s/(\\\\ref\{.*?)\}/\1_$f\}/g" $f/SystemRequirements_$f.tex
fi
done
마찬가지로 \a
BELL 문자( )입니다 \x07
.
답변2
인용 문제입니다. 변수에는 큰따옴표를 사용 $f
하지만 큰따옴표에는 다른 의미가 있습니다. 특히 문자를 백슬래시로 이스케이프할 수 있으므로 Perl에 도달하면 \\
다음과 같습니다.\
$ printf "%s\n" "print if s/(\\label\{.*?)\}/\1_$f\}/g"
print if s/(\label\{.*?)\}/\1_\}/g
이는 문자가 리턴으로 처리되기 r
때문에 문제를 야기합니다 (참조:\r
perlrebackslash
) - 일치하지 않습니다 r
. 대신 작은따옴표를 사용하고 변수에 대해서만 엽니다.
$ printf "%s\n" 'print if s/(\\label\{.*?)\}/\1_'"$f"'\}/g'
print if s/(\\label\{.*?)\}/\1_\}/g