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
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?
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)