Um desafio para sed converter código do Mathematica para Matlab

Um desafio para sed converter código do Mathematica para Matlab

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/). O gno 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 \2etc.

  • Para substituir Complex(a, b), eu uso Complex(\([^,]*\), *\([^)]*\)). Isso significa match Complex(, 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 seda 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.

informação relacionada