Um desafio para o código convertido do sed do Mathematica para o Matlab

2

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 todo Complexo (a, b) por (a + i * b) e todo Poder (a, b) para a ^ b. Então, o exemplo acima seria parecido com:

$ 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 sed para alcançar esse resultado? Não é direto em tudo, lendo expressões regulares e exemplos lá fora.

Como posso fazer isso usando sed ?

    
por user73869 28.06.2014 / 13:52

2 respostas

3

Isso deve ser feito:

sed 's/Complex(\([^,]*\), *\([^)]*\))/( + i*)/g; 
     s/Power(\([^,]*\), *\([^)]*\))/^/g' file

Isso não funcionará para instruções aninhadas como Power(Power(a, b), c) .

Explicação

  • Para substituir os padrões em sed , use o operador de substituição ( s/pattern/replacement/ ). O g no final significa global , faz com que a substituição seja aplicada a todas as correspondências.

  • Os padrões podem ser capturados e reutilizados posteriormente, colocando-os em parênteses com escape: \( e %código%. O primeiro desses padrões é \) , o segundo etc.

  • Para substituir , eu uso Complex(a, b) . Isso significa correspondência Complex(\([^,]*\), *\([^)]*\)) , em seguida, a cadeia mais longa de caracteres não- Complex( consecutivos ( , ) é capturada como \ 1, depois uma vírgula única e zero ou mais espaços, depois a cadeia mais longa de não [^,]* caracteres até que o parêntese de fechamento seja encontrado. A coisa toda é substituída por ) .

  • A expressão regular que corresponde ao ( + i*) é essencialmente a mesma.

por 28.06.2014 / 15:15
0

Você pode usar a função de substituição de string de sed :

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 você deseja substituir e (a + i*b) pela string desejada em vez dessa expressão.

    
por 28.06.2014 / 14:33