
Eu tenho a seguinte saída do Mathematica para o código C:
$ cat file.txt
Complex(1.3, 2.7)*Power(kappa, 2.0) + Complex(0.3, 2.0)*Power(kappa,5.0)*log(alpha)
O arquivo é extremamente longo (muitas dezenas de milhares de linhas). Eu gostaria de substituir cada Complex(a, b) por (a + i*b) e cada Power(a, b) por a^b. Portanto, o exemplo acima ficaria assim:
$ cat desired_file.txt
(1.3 + i*2.7)*kappa^2.0 + (0.3 + i*2.0)*kappa^5.0*log(alpha)
Como posso usar o sed para alcançar esse resultado? Não é nada simples ler expressões regulares e exemplos por aí.
Como posso fazer isso usando sed
?
Responder1
Isso deve servir:
sed 's/Complex(\([^,]*\), *\([^)]*\))/(\1 + i*\2)/g;
s/Power(\([^,]*\), *\([^)]*\))/\1^\2/g' file
Isso não funcionará para instruções aninhadascomo Power(Power(a, b), c)
.
Explicação
Para substituir padrões em
sed
, você usa o operador de substituição (s/pattern/replacement/
). Og
no final significaglobal, faz com que a substituição seja aplicada a todas as correspondências.Os padrões podem sercapturadoe reutilizados posteriormente, colocando-os entre parênteses de escape:
\(
e\)
. O primeiro desses padrões é\1
, o segundo\2
etc.Para substituir
Complex(a, b)
, eu usoComplex(\([^,]*\), *\([^)]*\))
. Isso significa matchComplex(
, então a sequência mais longa de não-,
caracteres consecutivos ([^,]*
) é capturada como \1, depois uma única vírgula e zero ou mais espaços, depois a sequência mais longa de não-)
caracteres até que o parêntese de fechamento seja encontrado. A coisa toda é substituída por(\1 + i*\2)
.A expressão regular que corresponde a
Power()
é essencialmente a mesma.
Responder2
Você pode usar sed
a função de substituição de string de:
sed -i 's/"complex(a, b)"/(a + i*b)/g'
O mesmo para o outro padrão, basta substituir complex(a,b)
pela expressão que deseja substituir e (a + i*b)
pela string desejada em vez dessa expressão.