Referência anterior ao texto correspondente no awk

5

Eu preciso escapar de alguns caracteres da minha entrada do awk (GNU Awk 4.2.0) - { com \{ , [ com \[ e | com \| . Eu realizei isso com três gsub chamadas:

for (i = 2; i <= NF; i++) {
    gsub(/{/, "\{", $i)
    gsub(/\[/, "\[", $i)
    gsub(/\|/, "\|", $i)
}

Como posso combinar essas três chamadas em uma? Algo como

gsub(/([{[|])/, "\", $i)
    
por rambius 22.02.2018 / 22:31

1 resposta

7

Você pode usar & na substituição para se referir ao texto correspondente :

$ awk '{gsub(/[[{|]/, "\\&", $0); print}' <<<"abc { | [ def"
abc \{ \| \[ def

Isso é apenas uma classe de caractere [...] regular com [ , | e { no padrão e uma barra invertida com escape suficiente seguida por & na substituição. Você precisa de todos eles.

Para padrões mais complexos o gawk tem uma função gensub que permite fazer referências a parte do texto, como \1 , mas você não precisa disso aqui. Todos os awk s compatíveis com POSIX suportam o comportamento & para incluir toda a subsequência correspondente na substituição.

    
por 22.02.2018 / 22:44

Tags