마크다운을 사용하여 졸업 논문을 작성하고 싶습니다. 안타깝게도 완벽한 편집자가 없기 때문에 즉흥적으로 작성해야 합니다. bibtex 인용의 경우 pandoc에 대한 입력을 처리하기 전에 일종의 bash-filter를 사용하여 내 정의를 변환하고 싶습니다.
<@BIBTEX_ID[|OPTIONAL_PAGE_OR_CHAPTER_NUM[|OPTIONAL_UNIT_DEFINITION]]>
이 같은:
\autocite[OPTIONAL_UNIT_DEFINITION][OPTIONAL_PAGE_OR_CHAPTER_NUM]{BIBTEX_ID}
예:
<@sample> ---> \autocite{sample}
<@sample|12> ---> \autocite[12]{sample}
<@sample|12|c.> ---> \autocite[12][c.]{sample}
어떤 bash/unix 도구가 작업을 수행할 수 있나요? sed나 awk를 사용하여 이 작업을 수행할 수 있나요?
답변1
sed
직접 사용할 수 있습니다 .
sed -e 's/<@\([^|>]*\)|\([^|>]*\)|\([^>|]*\)>/\\autocite[\2][\3]{\1}/g' \
-e 's/<@\([^|>]*\)|\([^|>]*\)>/\\autocite[\2]{\1}/g' \
-e 's/<@\([^|>]*\)>/\\autocite{\1}/g'
이는 가능한 각 수식을 개별적으로 대체합니다. 첫 번째는 3개의 인수 참조를 처리하고 그 다음에는 2개, 1개를 처리합니다. 각 선택적 블록은 \([^|>]*\)
출력에서 와 일치하고 대체됩니다 \1...3
.
답변2
sed '/^<@\([^|]*\)\(.*\)>/!b
s//\\autocite\2{\1}/
s/|/[/;s/|/][/g;/\[/s/{/]{/
' <<\DATA
<@sample>
<@sample|12>
<@sample|12|c.>
DATA
산출
\autocite{sample}
\autocite[12]{sample}
\autocite[12][c.]{sample}
가장 먼저 수행할 sed
작업은 처리 중인 줄이 로 시작하고 <@
그 뒤에 가 오는지 확인하는 것입니다 >
. 줄이 해당 패턴과 일치하지 않으면 b
스크립트에서 빠져나와 다음 줄 루프를 시작하고 다시 시도합니다.
그러나 일치하는 경우 해당 문자가 아닌 모든 문자 또는 임의의 문자를 참조하고 첫 번째 시퀀스 다음에 해당 줄의 마지막 발생까지 모든 문자 또는 임의의 문자를 참조함으로써 sed
약간의 이중 의무를 수행합니다 . 다음 줄(첫 번째 줄이 일치하는 경우에만 도달할 수 있음)에서는 첫 번째 주소에서 이러한 참조를 빌려 전체 문자열을 해당 항목으로 바꿉니다.\1
@
|
\2
>
sed
\\autocite\2{\1}
다음 줄에서는 첫 번째 문자를 a 로 sed
바꾸고 , 더 많은 문자를 a 로 바꾸고 , 마지막으로 a 가 줄에 있으면 첫 번째 문자를 a 로 바꿉니다 .|
[
|
][
[
{
]{
모든 일은 sed
간단합니다. 그것이 하는 모든 일은 sed
방금 한 일의 직접적인 결과입니다. sed
질서정연하고 때로는 짜증스럽습니다.
참고 - 이것은 |
한 줄에 지정한 만큼의 개별 인수를 처리해야 하며 두 개로 제한되지 않습니다. 그러나 표시와 선의 위치는 [<>@|{}]
적어도 쓰여진 대로 준수해야 합니다. 규칙을 준수하는 한 sed
어떤 규칙도 위반하지 않을 것입니다.