2009-09-29 85 views
2

我有幾個C#類,其中命名空間沒有添加到文件中。示例文件如下所示(Test.cs):使用awk向C#文件添加命名空間

using System; 
using System.IO; 

public partial class MyTestClass 
{ 
    protected void MyTestVoid() 
    { 
     // Magic happens here 
    } 
} 

如您所見,不存在名稱空間聲明。我想輸出是:

using System; 
using System.IO; 

namespace MyNamespace 
{ 
    public partial class MyTestClass 
    { 
     protected void MyTestVoid() 
     { 
      // Magic happens here 
     } 
    } 
} 

我所試圖做的是寫一個快速腳本基本上圍繞插入類定義的命名空間。我決定嘗試AWK出來,所以我創建了一個awk文件,像這樣:

$0 ~ "namespace MyNamespace" 
{ 
    foundTrigger = 1; 
} 

!foundTrigger 
{ 
    if ($0 ~ "/^[:space:]*public[:space:]{1}(partial[:space:])*class/") 
    { 
     print "namespace MyNamespace\n{\n" $0; 
    } 
    else 
    { 
     print $0; 
    } 
} 

END 
{ 
    if (!foundTrigger) 
     print "}"; 
} 

從將執行這一個文件(像上面的),它並沒有真正做任何事情(除了後「} 「到文件的底部)。

這是我的理解我的正則表達式中使用:

^[:space:]*public[:space:]{1}(partial[:space:])*class 

行必須以零個或多個空格其次是「公共」一詞後緊跟一個空格,接着是零個或多個(」部分「後跟一個空格),後面跟着」班級「一詞。因此,這些線路應符合:

public class Test 
public partial class Test 

而且這些不匹配:

public void Test() 
public string Test 

但是如果我使用了類似的正則表達式egrep的:

egrep "^[[:space:]]*public[[:space:]]{1}(partial[[:space:]])*class" *.cs 

我得到這樣的結果:

public partial class MyTestClass 

閱讀手冊頁awk顯示:

正則表達式是在egrep中找到的擴展類型。

所以我不知道爲什麼我的awk腳本不工作。任何幫助表示讚賞。也許有更好的方法來完成我想要做的事情?

回答

0

也許這有助於看問題有點不同。不要試圖用正則表達式匹配後面的行,嘗試抓住整個using「段落」本身。附加到該文件並完成文件。

BEGIN { 
     RS = ""; # Read by "paragraphs". 
       # Records are separated by blank lines. 
    } 
    { 
     if (NR == 1) 
     { 
      print $0,"\n\nnamespace MyNameSpace;\n{"; 
      RS = "\n"; 
     } 
     else 
     { 
      print "\t", $0; # For indenting 
     } 
    } 
    END { 
     print "}"; 
    } 

編輯:本來我插入了「使用」指令。他想要「命名空間」(和適當的語法):幾乎相同的問題。固定。

+0

我修改了你的一些以適應我的需要: BEGIN { RS =「」; #閱讀「段落」。 #記錄由空行分隔。如果(NR == 1) { print $ 0,「\ nnamespace MyNameSpace \ n {\ n」;} RS =「\ n」; #重置記錄分隔符 } else { print $ 0; } } – smoak

+0

哦,哦。我解決了錯誤的問題(使用/命名空間),正確的方法。 :) 很高興它對你有效。 –

0

這應做到:

 
/^ *public (partial)*class/{trigger = 1 ; print "namespace MyNamespace"} 
{print $0} 
END {if(trigger) print "} //end of space"} 

但你似乎非常嚴密的關於空白。我會放鬆一點,但是我不相信自己打字。