
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/
). Dasg
am 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\2
usw.Um zu ersetzen
Complex(a, b)
, verwende ichComplex(\([^,]*\), *\([^)]*\))
. Das bedeutet, dass mit übereinstimmtComplex(
, 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 sed
die 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.