
Mathematica から C コードへの出力は次のようになります。
$ cat file.txt
Complex(1.3, 2.7)*Power(kappa, 2.0) + Complex(0.3, 2.0)*Power(kappa,5.0)*log(alpha)
ファイルは非常に長いです (数万行)。すべての Complex(a, b) を (a + i*b) に、すべての Power(a, b) を a^b に置き換えたいと思います。上記のサンプルは次のようになります。
$ cat desired_file.txt
(1.3 + i*2.7)*kappa^2.0 + (0.3 + i*2.0)*kappa^5.0*log(alpha)
sed を使用してこの結果を達成するにはどうすればよいでしょうか? 正規表現や例を読んでも、まったく簡単ではありません。
を使ってこれをどうやって実行できますかsed
?
答え1
こうすればできるはずです:
sed 's/Complex(\([^,]*\), *\([^)]*\))/(\1 + i*\2)/g;
s/Power(\([^,]*\), *\([^)]*\))/\1^\2/g' file
これはネストされた文では機能しませんのようにPower(Power(a, b), c)
。
説明
内のパターンを置換するには
sed
、置換演算子(s/pattern/replacement/
)を使用します。g
末尾の は、グローバルすると、すべての一致に置換が適用されます。パターンは捕らえられたそして、それらをエスケープされた括弧内に配置すると、後で再利用されます:
\(
および\)
。最初のそのようなパターンは\1
、2 番目\2
は などです。を置き換えるには
Complex(a, b)
、 を使用しますComplex(\([^,]*\), *\([^)]*\))
。これは、 に一致することを意味しComplex(
、次に連続する非,
文字 ([^,]*
) の最長の文字列が \1 としてキャプチャされ、次に 1 つのコンマと 0 個以上のスペース、次に閉じ括弧が見つかるまで非文字の最長の文字列がキャプチャされます)
。全体が に置き換えられます(\1 + i*\2)
。一致する正規表現は
Power()
基本的に同じです。
答え2
sed
の文字列置換関数を使用できます:
sed -i 's/"complex(a, b)"/(a + i*b)/g'
他のパターンについても同様で、complex(a,b)
置き換えたい表現と、(a + i*b)
その表現の代わりに必要な文字列を置き換えるだけです。