sed 將程式碼從 Mathematica 轉換為 Matlab 的挑戰

sed 將程式碼從 Mathematica 轉換為 Matlab 的挑戰

我從 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等等。

  • 為了替換Complex(a, b),我使用Complex(\([^,]*\), *\([^)]*\)).這意味著 match Complex(,然後最長的連續非,字元 ( [^,]*) 字串被捕獲為 \1,然後是單個逗號和零個或多個空格,然後是最長的非)字元字串,直到找到右括號。整個事情被替換為(\1 + i*\2)

  • 匹配的正規表示式Power()本質上是一樣的。

答案2

您可以使用sed的字串替換功能:

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

對於其他模式也是如此,只需替換complex(a,b)為您要替換的表達式以及(a + i*b)您想要的字串而不是該表達式。

相關內容