awk: evite a substituição entre dois símbolos

2

Eu tenho as seguintes linhas no meu programa awk :

str = gensub(/'([^']*)'/, "\\texttt{\1}", "g", str);
str = gensub(/\*([^\*]*)\*/, "\\textbf{\1}", "g", str);

Essas linhas executam uma substituição não-voraz por '...' e *...* por resp. \texttt{...} e \textbf{...} .

Estou procurando uma maneira de evitar a substituição *...* quando ela é "semi-aninhada" ou aninhada em '...' , por exemplo, '...*...'...* ou '...*...*...' .

Entrada e saída esperada:

  1. '.*' text '^.*$' --- > %código%
  2. \texttt{.*} text \texttt{^.*$} --- > %código%
por Firmin Martin 13.05.2018 / 03:42

1 resposta

2

Você precisa identificar os dois padrões A e B em uma única passagem e, depois, alterá-los posteriormente. A seguir, os dois padrões são mesclados em um (A|B) e marcados com o prefixo string XXX . Em seguida, ele procura por XXX e o padrão A para a substituição real. Da mesma forma, para B . Isso não manipula seu caso 'a*b'c* semi-aninhado.

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*'
 '...*...*...'
 '...*...'...*
!

Saída

 \texttt{abc} \textbf{abc}
 \texttt{.*} text \texttt{^.*$}
 \texttt{*abc*}
 \texttt{...*...*...}
 \texttt{...*...}...*
    
por 13.05.2018 / 10:47

Tags