awk: 2 つの記号間の置換を避ける

awk: 2 つの記号間の置換を避ける

私の中には次の行がありますアップログラム:

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つのパターンが1つにまとめられ、(A|B)文字列プレフィックスとして表示されますXXX。次に真の代替パターンを見つけますXXXA繰り返しますが、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{...*...}...*

おすすめ記事