私の中には次の行がありますアップログラム:
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つのパターンが1つにまとめられ、(A|B)
文字列プレフィックスとして表示されます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{...*...}...*