我的中有以下几行awk程序 :
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{...*...}...*