awk:避免两个符号之间的替换

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

您需要一次性识别这两种模式,然后稍后更改它们AB下面将 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{...*...}...*

相关内容