
我從 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(\([^,]*\), *\([^)]*\))
.這意味著 matchComplex(
,然後最長的連續非,
字元 ([^,]*
) 字串被捕獲為 \1,然後是單個逗號和零個或多個空格,然後是最長的非)
字元字串,直到找到右括號。整個事情被替換為(\1 + i*\2)
。匹配的正規表示式
Power()
本質上是一樣的。
答案2
您可以使用sed
的字串替換功能:
sed -i 's/"complex(a, b)"/(a + i*b)/g'
對於其他模式也是如此,只需替換complex(a,b)
為您要替換的表達式以及(a + i*b)
您想要的字串而不是該表達式。