awk: 두 기호 사이의 대체를 피하세요

awk: 두 기호 사이의 대체를 피하세요

내 안에는 다음 줄이 있습니다프로그램:

str = gensub(/`([^`]*)`/, "\\\\texttt{\\1}", "g", str);
str = gensub(/\*([^\*]*)\*/, "\\\\textbf{\\1}", "g", str);

`...`이 라인은 및 각각에 대해 탐욕스럽지 않은 대체를 수행합니다 *...*. \texttt{...}그리고 \textbf{...}.

예 를 들어 *...*"반 중첩"되거나 중첩된 경우 교체를 피하는 방법을 찾고 있습니다 .`...``...*...`...*`...*...*...`

입력 및 예상 출력:

  1. `.*` text `^.*$`--->\texttt{.*} text \texttt{^.*$}
  2. `*abc*`--->\texttt{*abc*}

답변1

두 모드를 한 번 식별한 다음 나중에 변경해야 합니다 A. B아래에서는 2개의 패턴이 하나로 결합되어 (A|B)string 접두사로 표시됩니다 XXX. 그런 다음 진정한 대체 패턴을 찾습니다 XXX. A다시 말하지만, B이것은 반 중첩된 사례를 처리하지 않습니다 `a*b`c*.

awk '{ str = $0
 str = gensub(/(`[^`]*`|\*[^\*]*\*)/, "XXX\\1", "g", str);
 str = gensub(/XXX`([^`]*)`/, "\\\\texttt{\\1}", "g", str);
 str = gensub(/XXX\*([^\*]*)\*/, "\\\\textbf{\\1}", "g", str);
 print str
}' <<\!
 `abc` *abc*
 `.*` text `^.*$`
 `*abc*`
 `...*...*...`
 `...*...`...*
!

산출

 \texttt{abc} \textbf{abc}
 \texttt{.*} text \texttt{^.*$}
 \texttt{*abc*}
 \texttt{...*...*...}
 \texttt{...*...}...*

관련 정보