如何在许多文件中的每个方法的开头添加一条INDENTED行?

时间:2016-02-18 14:58:57

标签: regex perl sed

我想在许多C#文件中为每个方法添加一个跟踪线(参见下面的示例),当然我想自动执行此操作。

我的方法是使用正则表达式来匹配以publicprivate开头的行,没有;(排除成员),有括号(不包括类定义),向上打开{,所有这些跨越多行,并在此之后添加我的行。

sed将是我的自然选择,但遗憾的是它不太适合多行匹配。

我几乎不知道perl,但我管理了以下内容:

perl -0777 -i.original -pe 's/((private|public)[^;]*?\)\s*?{)/\1\nActivityLoggers.traceMethod();/igs' testFile.cs

这很好但我想添加缩进的行。假设{总是在一个单独的行上,我可以重复使用我的文本替换{,但这里我不知道perl会阻止我。非常感谢任何帮助。

作为奖励,您可以帮助排除构造函数:)

示例:
这个

public partial class AClass : BClass
{
    private static string name;
    private void Method1(int i, string s)
    {
        doSomethng();
    }
    public void Method2
                   (int i, string s)
    {
        doSomethngElse();
    }
 }

进入这个

public partial class AClass : BClass
{
    private static string name;
    private void Method1(int i, string s)
    {
        ActivityLoggers.traceMethod();
        doSomethng();
    }
    public void Method2
                   (int i, string s)
    {
        ActivityLoggers.traceMethod();
        doSomethngElse();
    }
 }

(如果您正在游荡,我会使用traceMethod() :)在StackTrace中获取调用方法和类名称。)

4 个答案:

答案 0 :(得分:1)

要解决您发布的内容,请使用此模式

((private|public)[^;]*?\)\s*?{)(?=\R+(\s+))

并替换为

$1\n$3ActivityLoggers.traceMethod()

Demo

答案 1 :(得分:1)

使用sed:

sed '/\(private\|public\)[^;]*/, /\}/ {
        /\(^[ \t]*\)\([^(]*();\)/ s//\1ActivityLoggers.traceMethod();\n\1\2\n/;
}' sourcefile

/\(private\|public\)[^;]*/, /\}/定义一个模式空间,其中包含}(=方法块的结尾)的private | public和next line之间的一系列行

在匹配的每个块中,我们搜索模式方法并应用替换,使用组添加新行

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;/^\s*(public|private)/,/^\s*\{\s*$/{/^\s*\{\s*$/!b;n;/^\s*(public|private)/ba;h;s/\S.*/ActivityLoggers.traceMethod();/p;g}' file

这会查找以publicprivate开头并以{结尾的范围。然后它会读取下一行,如果这是以publicprivate循环开头的话。否则它复制该行并用缩进替换所需的字符串并打印出来。然后它检索复制的行并打印出来。

答案 3 :(得分:1)

使用GNU awk进行多字符RSgensub()

$ gawk -v RS='^$' -v ORS= '{print gensub(/((private|public)[^;)]+\)\s*{)(\s*)/,"\\1\\3ActivityLoggers.traceMethod();\\3","g")}' file  
public partial class AClass : BClass
{
    private static string name;
    private void Method1(int i, string s)
    {
        ActivityLoggers.traceMethod();
        doSomethng();
    }
    public void Method2
                   (int i, string s)
    {
        ActivityLoggers.traceMethod();
        doSomethngElse();
    }
}