AWK 스크립트의 패턴을 기반으로 텍스트의 특정 부분을 처리합니다.

AWK 스크립트의 패턴을 기반으로 텍스트의 특정 부분을 처리합니다.

내 취향에 따라 tex 문서를 html로 변환하기 위해 awk에서 스크립트를 개발 중입니다.

#!/bin/awk -f

BEGIN {
    FS="\n";
    print "<html><body>"
}
# Function to print a row with one argument to handle either a 'th' tag or 'td' tag
function printRow(tag) {
    for(i=1; i<=NF; i++) print "<"tag">"$i"</"tag">";
}

NR>1 {
   [conditions]
   printRow("p")
}

END {
    print "</body></html>"
}

보시다시피, 그것은 매우 어린 발달 단계에 있습니다.

\documentclass[a4paper, 11pt, titlepage]{article}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{imakeidx}
[...]

\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla placerat lectus sit amet augue facilisis, eget viverra sem pellentesque. Nulla vehicula metus risus, vel condimentum nunc dignissim eget. Vivamus quis sagittis tellus, eget ullamcorper libero. Nulla vitae fringilla nunc. Vivamus id suscipit mi. Phasellus porta lacinia dolor, at congue eros rhoncus vitae. Donec vel condimentum sapien. Curabitur est massa, finibus vel iaculis id, dignissim nec nisl. Sed non justo orci. Morbi quis orci efficitur sem porttitor pulvinar. Duis consectetur rhoncus posuere. Duis cursus neque semper lectus fermentum rhoncus.

\end{document}

내가 원하는 것은 스크립트가 라이브러리, 변수 등을 가져오기 전과 그 \begin{document}사이의 줄만 해석한다는 것입니다 \end{document}. 지금은 그것에 관심이 없습니다.

해당 패턴 내의 텍스트만 처리하도록 하려면 어떻게 해야 합니까?

답변1

awk를 호출하기 위해 shebang을 사용하지 마십시오. 상황이 더 복잡해지고 쉘 기능과 awk 기능을 활용할 수 있는 능력이 사라지고 스크립트를 awk 특정 구문과 긴밀하게 연결됩니다.https://stackoverflow.com/a/61002754/1745001.

스크립팅을 시작하는 방법은 다음과 같습니다.

#!/usr/bin/env bash

awk '

    BEGIN {
        print "<html><body>"
    }
    
    # Function to print a row with one argument to handle either a "p" or "th" tag or "td" tag
    function printRow(tag,    i) {
        for(i=1; i<=NF; i++) print "<"tag">" $i "</"tag">"
    }
    
    $0 == "\begin{document}" { f=1 }
    $0 == "\end{document}"   { f=0 }
    
    !f { next }
    
    [conditions] {
       printRow("p")      # or "th" or "td"
    }
    
    END {
        print "</body></html>"
    }

' "${@:--}"

함수에서 1에서 NF까지의 루프를 사용했기 때문에 제거했습니다 FS="\n". 이는 FS와 RS가 동일한 경우에는 의미가 없습니다. 이렇게 하면 NF가 항상 1이 되기 때문입니다.

답변2

나는 이것이 구현하기 쉽다고 생각합니다. 예를 들어 블록 0에서 초기화될 플래그를 지정할 수 있습니다( 초기화되지 않은 변수는 부울 테스트에서 "false"로 평가되므로 선택 사항입니다). 플래그가 설정되지 않았다고 행에 명시되어 있는지 확인하도록 구체적으로 지시하고 , 그렇지 않으면 해당 행을 무시하십시오. 플래그는 이 명령문이 발생할 때만 설정되고 일반적인 처리가 수행됩니다. 발생 하면 플래그가 재설정됩니다.BEGINawkawk\begin{document}\begin1\end{document}

따라서 다음과 같이 스크립트를 수정할 수 있습니다.

!f{if ($1=="\begin{document}") f=1; next}

f && ($1=="\end{document}") {f=0; next}

f==1 {
   [conditions]
   printRow("p")
}

f여기서 "설정" 및 "재설정" 조건은 while이 설정되지 않았고 건너뛰기를 원하기 때문에 다릅니다.모든line (포함 \begin{document}) 라인, 하지만또한\begin명령문이 발견되면 플래그가 설정되고 f플래그가 설정되면 재설정해야 합니다.그리고이 줄은 현재 동작이 존재하는 경우에만 건너뜁니다 \end{document}.

관련 정보