2011-05-10 89 views
1

我想修改一個大的代碼base.My如果循環如下。shell腳本如果循環操縱

該代碼可能包含如下內容。這只是一個if條件的隨機組合示例。如果條件單獨,我需要修改if else。

if((A==B)&&(C==D)&&((E==F)||(G==H))||(I)&&(J!=K)) 

應修改爲

if((string.Compare(A,B)==0)&&(string.Compare(C,D)==0)&&((string.Compare(E,F)==0)||(string.Compare(G,H)==0))||(I)&&(string.Compare(J,K)!=0)) 

我試圖用Java,但完全failed.I相信這是可能的SED或awk.Any幫助?

+0

ANTLR是一種完美的目的:) – 2011-05-10 07:09:04

+0

不能使用ANTLR.Need shell或java或c# – Harish 2011-05-10 07:21:25

+0

-1問題確實不清楚。如果你想要被理解,你應該付出一些努力。不要責怪別人。 – Rajish 2011-05-10 08:10:33

回答

2

基本上可以使用任何支持正則表達式替換的語言來執行此操作。

這裏是一個三線的工作C#例如:

string text = "if((A==B)&&(C==D)&&((E==F)||(G==H))||(I)&&(J!=K))"; 
string pattern = @"\((?:(\w)((?:=|!)=)(\w))\)"; 
var replaced = Regex.Replace(text, pattern, m => string.Format("(string.Compare({0},{1}){2}0)", m.Groups[1].Value, m.Groups[3].Value, m.Groups[2].Value)); 

Console.WriteLine(replaced); 

而結果:

if((string.Compare(A,B)==0)&&(string.Compare(C,D)==0)&&((string.Compare(E,F)==0)||(string.Compare(G,H)==0))||(I)&&(string.Compare(J,K)!=0))

+0

我想這就是我想要的。我會嘗試在Java中獲得相當於它,因爲我不熟悉c# – Harish 2011-05-10 08:23:26

+1

@ Harish嘗試用Java來做。瞭解Java如何替換正則表達式匹配,然後翻譯代碼。正則表達式應該是相同的。 – 2011-05-10 08:32:52

0

基本上,您不需要使用awksed來構造if語句。這足以寫:

if [ A == B -a C == D -a (E == F -o G == H) -o I -a J != K ]; then 
    your code here 
fi 

==操作比較字符串。如果您想比較數字,請使用-eq運算符。請參閱this chapter of bash manual(向下滾動至test命令)和description of usage of primary conditional expressions

+0

我幾乎可以肯定他不是在談論它。他想要的是將一些代碼文件語法轉換爲另一種。 – 2011-05-10 07:03:21

+0

其實你有我的問題wrong.Its操縱文本里面,如果循環不關於如果循環 – Harish 2011-05-10 07:20:13

2
sed -r 's/([[:alpha:]])([=!]=)([[:alpha:]])/string.Compare(\1,\3) \2 0/g' 

各地\2的空間是不是絕對必要。

+0

非常有趣:)末尾的'0/g'是什麼意思? – 2011-05-13 08:26:53

+0

@Oscar,對於'string.Compare'布爾值,「0」只是一個零。 「/」標記sed's命令的替換文本的結尾。 「g」表示在文本中執行全局搜索和替換。 – 2011-05-13 13:04:41

+0

謝謝。 'g'就是我一直在尋找的東西:) – 2011-05-13 16:22:53