
내 안에는 다음 줄이 있습니다앗프로그램:
str = gensub(/`([^`]*)`/, "\\\\texttt{\\1}", "g", str);
str = gensub(/\*([^\*]*)\*/, "\\\\textbf{\\1}", "g", str);
`...`
이 라인은 및 각각에 대해 탐욕스럽지 않은 대체를 수행합니다 *...*
. \texttt{...}
그리고 \textbf{...}
.
예 를 들어 *...*
"반 중첩"되거나 중첩된 경우 교체를 피하는 방법을 찾고 있습니다 .`...`
`...*...`...*
`...*...*...`
입력 및 예상 출력:
`.*` text `^.*$`
--->\texttt{.*} text \texttt{^.*$}
`*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{...*...}...*