문서를 perl
수정하기 위해 명령을 사용하려고 합니다 . LaTeX
실제로 인용 형식을 다음과 같이 변경하려고 합니다.
. \cite{poelma20113d}
도착하다
\cite{poelma20113d}.
즉, 앞에 마침표와 공백이 있는 따옴표를 찾아서 공백으로 바꾼 다음 따옴표와 마침표를 그 뒤에 배치하고 싶습니다. 누구든지 perl
하나의 라이너로 이 작업을 수행하는 방법을 도와줄 수 있습니까 ? 이렇게 하고 싶은 이유는 제가 준비하고 있는 원고의 형식을 Journal of Physics of Fluids에서 Journal of Physical Review E로 바꾸고 싶기 때문입니다.
답변1
LaTeX는 LaTeX를 통해서만 올바르게 구문 분석될 수 있다고 확신합니다.1Perl에서 LaTeX를 구현하는 것은 정말 어려운 일이 될 것입니다. 따라서 간단한 Perl 솔루션은 특정 엣지 조건에서 실패합니다. 다음 예제를 사용하세요
이것은 cite{foo}입니다. \cite{foo} 이것은 cite[foo]{bar}입니다. \cite[foo]{bar} 이것은 citet{foo, bar}입니다. \citet{foo, 바}
여기에는 단일 선택적 인수, 여러 참조, \cite
다음으로 시작하는 대체 항목, 및 \cite
사이의 가변 개수의 공백이 포함됩니다. 다음 표현은 필요한 것을 수행하는 것 같습니다.
\cite
perl
perl -pe 's/(.\s*)(\\cite)([^{]*)(\[[^\]]*\])?{([^}]*)}/\2\3\4\{\5\}./g' afile
이것은 cite{foo}\cite{foo}입니다. cite[foo]{bar}\cite[foo]{bar}입니다. citet{foo, bar}\citet{foo, bar}입니다.
답변2
쿼리할 때 스왑을 찾아 수행합니다.
$ perl -lpe 's/\. (\\cite.*)/$1./' afile
\cite{poelma20113d}.
한 줄의 코드를 가지려면 파일을 실제로 변경하십시오.
$ perl -i.bak -lpe 's/\. (\\cite.*)/$1./' afile
afile.bak
.bak 파일 생성을 중단하려면 perl
스위치에 대한 인수를 생략하여 이 작업을 수행하지 않도록 지정할 수 있습니다 -i
.
$ perl -i -lpe 's/\. (\\cite.*)/$1./' afile
어떻게 작동하나요?
위의 예에서는 file 의 각 문자열에서 다음 비트를 찾습니다 afile
.
\.
- 텍스트를 찾아보세요 ..s/.../../
- 패턴을 검색하여 다른 패턴으로 교체해 보세요.(\\cite.*)
- 텍스트 패턴, \문자열cite
및 기타 항목을 찾습니다. 이 모든 내용은$1
괄호(예: )로 묶여 있으므로 변수에 저장됩니다 (....). 노트:(\\cite.*})
닫는 중괄호에 도달하면 중지됩니다}
. 예를 들어 이렇게 하면LaTeX
\cite{}
in 명령 뒤의 다음 문장이. \cite{poelma20113d} This is the next sentence.
올바르게 처리됩니다.$1.
- 는$1
괄호 안에 일치하는 내용이므로 뒤에 넣고 를 추가합니다 ..