Analisando pares de chaves contendo escapes de chaves

2

Eu tenho algum texto onde certas partes são marcadas com _{...} ; Eu preciso substituir o par de sublinhado e par de colchetes por asteriscos. Então, por exemplo, Hello _{world} _{foo} se tornaria Hello *world* *foo* .

Este é um problema fácil, que poderia ser facilmente resolvido com sed -r 's/_\{([^}]+)}/**/g' , não fosse pelo fato de que eles podem conter escapes de chaves. Então, por exemplo, o texto:

Hello _{world \} \}} _{foo bar}

resultaria em:

Hello *world } }* *foo bar*

Como devo fazer isso?

    
por user2064000 05.01.2017 / 16:58

2 respostas

3

Se uma barra invertida significa "escape do próximo caractere" (seja uma chave, outra barra invertida ou qualquer coisa exceto final de linha), você pode "pular" o próximo caractere como este:

sed -r 's/_\{((\.|[^}\])+)\}/**/g

Se a barra invertida tiver apenas um significado especial antes da chave, será necessário "pular" o primeiro caractere não-barra invertida após cada execução de uma ou mais barras invertidas:

sed -r 's/_\{((\+[^\]|[^}\])+)\}/**/g'
    
por 05.01.2017 / 17:21
1

Quando você quer combinar algo que não seja precedido por algo, você precisa de um look-behind negativo. sed não suporta look-ahead e look-behind, mas o Perl faz.

echo 'Hello _{world \} \}} _{foo bar}' | perl -npe 's/_\{(.+?)(?<!\)}/**/g'

Isso produzirá:

Hello *world \} \}* *foo bar*
    
por 05.01.2017 / 17:07