2015-05-20 97 views
0

的產品更換電源2的一個變量,我想用sed替換下列表達式:由sed的 - 由兩個變量

cos(2*a)*cos(2*a)+sin(3*b)*sin(3*b)+m1*m1*m2*m2*cos(4*c) 

cos(2*a)^2+sin(3*b)^2+m1^2*m2^2*cos(4*c) 

正如你所看到的,我會就像用冪2(具有^ 2曝光度)將所有變量由這些變量的乘積自己轉換一樣。

我試着用圖案符號「^ 2」之前做到這一點:

echo "cos(2*a)^2+sin(3*b)^2+m1^2*m2^2*cos(4*c)" | sed 's/\(.*\)\^2/\1\*\1/g' 

,但它不工作。

如果有人可以幫助我...

感謝

+0

這不是一個簡單的任務。你如何確定「^ 2」之前的「單位」是什麼?你需要解析表達式,而'sed'不能這樣做。 –

+1

正則表達式不是解決每個問題的方法。通常,由於在括號內具有任意嵌套的子表達式的能力,所以這組有效的數學表達式不構成常規語言。 'sed'正則表達式無法正確識別這些字符串。例如,您無法編寫正確識別正確匹配圓括號的正則表達式。如果你可以在'^'之前給出*精確的*允許的內容,你可以寫一個正則表達式來捕獲它。 – chepner

回答

2

你可以用字符類玩法:

sed 's/\([^(*+\/^-]*\(([^)]*)\)\?\)\^2/\1\*\1/g' 

注意,這會停止,如果你有嵌套括號工作。

+0

非常感謝你,現在我要試着去理解這個神奇的命令行 – youpilat13

+0

@ user1773603:沒有什麼魔力,它很簡單:'[^(+/^ - ]'是一個不包括'( ''''('[*]] *)'是一個描述圓括號和括號之間的東西的組, –

+0

@CasimiretHippolyte如果我在表達式中嵌套了括號,我還需要添加什麼:(l3^2 * m3 *(m1 * m2 + m1 * m3 + 2 * m2 * m3 - m2^2 * cos(t1-t2)^ 2-m3^2 * cos(t1-t3)^ 2-m3^2 * cos(t2-t3)^ 2 + m2^2 + m3^2 - m1 * m3 * cos (t2-t3)^ 2-m2 * m3 * cos(t1-t2)* 2 - m2 * m3 * cos(t2-t3)^ 2 + m2 * m3 * m3 t1-t3)* cos(t2-t3))) – youpilat13