
나는 많은 다국어 텍스트 파일을 구문 분석하기 위해 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
\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