Eine Herausforderung für sed-Konvertierungscode von Mathematica nach Matlab

Eine Herausforderung für sed-Konvertierungscode von Mathematica nach Matlab

Ich habe die folgende Ausgabe von Mathematica in C-Code:

$ cat file.txt
Complex(1.3, 2.7)*Power(kappa, 2.0) + Complex(0.3, 2.0)*Power(kappa,5.0)*log(alpha)

Die Datei ist extrem lang (viele zehntausend Zeilen). Ich möchte jeden Complex(a, b) durch (a + i*b) und jede Power(a, b) durch a^b ersetzen. Das obige Beispiel würde also so aussehen:

$ cat desired_file.txt
(1.3 + i*2.7)*kappa^2.0 + (0.3 + i*2.0)*kappa^5.0*log(alpha)

Wie kann ich sed verwenden, um dieses Ergebnis zu erzielen? Das ist überhaupt nicht einfach, wenn man die regulären Ausdrücke und Beispiele liest, die es gibt.

Wie kann ich dies tun, indem ich verwende sed?

Antwort1

Das hier sollte genügen:

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

Dies funktioniert nicht für verschachtelte Anweisungenwie Power(Power(a, b), c).

Erläuterung

  • Um Muster in zu ersetzen sed, verwenden Sie den Substitutionsoperator ( s/pattern/replacement/). Das gam Ende bedeutetweltweit, bewirkt es, dass die Ersetzung auf alle Spiele angewendet wird.

  • Muster können seingefangenund später wiederverwendet werden, indem sie in Escape-Klammern gesetzt werden: \(und \). Das erste derartige Muster ist \1, das zweite \2usw.

  • Um zu ersetzen Complex(a, b), verwende ich Complex(\([^,]*\), *\([^)]*\)). Das bedeutet, dass mit übereinstimmt Complex(, dann wird die längste Zeichenfolge aufeinanderfolgender Nicht- ,Zeichen ( [^,]*) als \1 erfasst, dann ein einzelnes Komma und null oder mehr Leerzeichen, dann die längste Zeichenfolge aus Nicht- )Zeichen, bis die schließende Klammer gefunden wird. Das Ganze wird durch ersetzt (\1 + i*\2).

  • Der entsprechende reguläre Ausdruck Power()ist im Wesentlichen derselbe.

Antwort2

Sie können seddie Zeichenfolgenersetzungsfunktion von verwenden:

sed -i 's/"complex(a, b)"/(a + i*b)/g'

Dasselbe gilt für das andere Muster. Ersetzen Sie es einfach complex(a,b)durch den Ausdruck, den Sie ersetzen möchten, und (a + i*b)durch die Zeichenfolge, die Sie anstelle dieses Ausdrucks verwenden möchten.

verwandte Informationen