我想在许多C#文件中为每个方法添加一个跟踪线(参见下面的示例),当然我想自动执行此操作。
我的方法是使用正则表达式来匹配以public
或private
开头的行,没有;
(排除成员),有括号(不包括类定义),向上打开{
,所有这些跨越多行,并在此之后添加我的行。
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
中获取调用方法和类名称。)
答案 0 :(得分:1)
要解决您发布的内容,请使用此模式
((private|public)[^;]*?\)\s*?{)(?=\R+(\s+))
并替换为
$1\n$3ActivityLoggers.traceMethod()
答案 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
这会查找以public
或private
开头并以{
结尾的范围。然后它会读取下一行,如果这是以public
或private
循环开头的话。否则它复制该行并用缩进替换所需的字符串并打印出来。然后它检索复制的行并打印出来。
答案 3 :(得分:1)
使用GNU awk进行多字符RS
和gensub()
:
$ 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();
}
}