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
は次のとおりです。を置き換えるには、 match を意味する . を
Complex(a, b)
使用し、最長の連続した非文字 ( ) 文字列は \1 でキャプチャされ、次に単一のカンマと 0 個以上の空白、および閉じ括弧が見つかるまで最長の非文字文字列がキャプチャされます。 。すべてに置き換えられました。Complex(\([^,]*\), *\([^)]*\))
Complex(
,
[^,]*
)
(\1 + i*\2)
一致する正規表現は
Power()
基本的に同じです。
答え2
使用できるsed
文字列置換機能は次のとおりです。
sed -i 's/"complex(a, b)"/(a + i*b)/g'
他のパターンと同様に、complex(a,b)
置換したい式と(a + i*b)
その式の代わりに目的の文字列に置き換えます。