我有幾個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腳本不工作。任何幫助表示讚賞。也許有更好的方法來完成我想要做的事情?
我修改了你的一些以適應我的需要: BEGIN { RS =「」; #閱讀「段落」。 #記錄由空行分隔。如果(NR == 1) { print $ 0,「\ nnamespace MyNameSpace \ n {\ n」;} RS =「\ n」; #重置記錄分隔符 } else { print $ 0; } } – smoak
哦,哦。我解決了錯誤的問題(使用/命名空間),正確的方法。 :) 很高興它對你有效。 –