Como converter * text * para {\ i text} com sed?

3

Eu gostaria de substituir todas as ocorrências de * text * em {\ i text}.

text *text* text
*text* text *text*
*text text text* text

deve se tornar

text {\i text} text
{\i text} text {\i text}
{\i text text text} text

etc.

Como posso fazer isso?

    
por Inno 25.01.2013 / 15:12

2 respostas

3

Supondo que cada ocorrência de *some text* esteja em uma única linha (isto é, não dividida em várias linhas):

sed -r 's/\*([^*]+)\*/{\i }/g' file
    
por 25.01.2013 / 15:33
2

Com qualquer POSIX sed e se o *...* puder ocupar várias linhas, você poderá fazer:

sed -e :1 -e 's/\*\([^*]\{1,\}\)\*/{\i }/g;/\*/!b' -e '$q;N;b1'

Observe que algumas implementações de sed têm um limite relativamente baixo no tamanho de seu espaço de padrão, então elas podem falhar se o *...* abranger muitas linhas (longas).

Com perl:

perl -0777 -pe 's/\*(.*?)\*/{\i $1}/gs'

Mas cuidado com o fato de que o arquivo inteiro fica na memória antes de fazer as substituições, o que pode ser um problema para arquivos grandes. Observe também que perl tem uma opção -i para atualizar o arquivo (que algumas implementações de sed tomaram emprestado)

    
por 25.01.2013 / 15:46

Tags