매개변수를 사용하여 맞춤 태그 변환

매개변수를 사용하여 맞춤 태그 변환

마크다운을 사용하여 졸업 논문을 작성하고 싶습니다. 안타깝게도 완벽한 편집자가 없기 때문에 즉흥적으로 작성해야 합니다. 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어떤 규칙도 위반하지 않을 것입니다.

관련 정보