2011-03-03 74 views
2

我试图写一个sed命令,允许我修改函数的参数。参数的数量可以是可变的。sed:修改函数参数

如果这是我的函数:

int myFunction(int arg1, int arg2, Dog arg3) { 
    // function implementation 
} 

我希望能够在INT ARG1,ARG2 INT,执行加法运算......

这里是我已经不工作:

sed -e '/^[a-zA-Z0-9_]\+\s\+[a-zA-Z0-9_]\+(/ , /)[\n\s]*{/ { 
    # arguments should be listed here 
}' 

任何帮助表示赞赏。对我来说很容易,这是我第一次尝试sed/shell脚本。

谢谢。

+1

如果它是一个可变数量的参数,你无法单独用正则表达式解决这个问题。你至少需要一个[上下文无关文法](http://en.wikipedia.org/wiki/Chomsky_hierarchy#The_hierarchy),或者一个黑客。 – Flexo 2011-03-03 09:04:09

回答

1

最终,sed不是此作业的正确工具 - 因为您对'参数数量可变'的评论。如果你正在处理一个固定类型的固定数量的参数,你可以绕过它,但是更常规的处理需要更通用的处理器(比sed)。

我建议尝试一个不同的任务,因为您对shell脚本和sed的介绍。

如果你必须这样做,那么也许:

sed '/^[A-Za-z_][A-Za-z0-9_]* *[A-Za-z_][A-Za-z0-9]* *([A-Za-z_][A-Za-z0-9_]* *\([A-Za-z_][A-Za-z0-9_]*\) *, *[A-Za-z_][A-Za-z0-9_]* *\([A-Za-z_][A-Za-z0-9_]*\)[ ,)].*{/{p;a\ 
    return \1 + \2; 
}' $file 

比赛的那部恐怖含有序列[A-Za-z_][A-Za-z0-9_]* 6倍;它每次都匹配一个标识符。 '[ ,)].*{中的分段与第三个或其后的参数匹配。模式中的空格可能应该是'[<blank><tab>]'字符类,但是在StackOverflow上输入却很痛苦。正则表达式,然后匹配函数的定义,并获取(在“\(<identifier>\)”部分的两个变量(在你的榜样arg1arg2)的行动时,这是公认的名称是:

  1. p - 打印
  2. a - 将以下行添加到输出中;在这种情况下,一行包含一个返回语句,该语句是两个记忆参数名称的总和,反斜线表示存在另一行的大括号将操作组合在一起。

某些版本的sed支持比其他版本更强大的正则表达式;我不确定,即使GNU sed支持PCRE(Perl兼容正则表达式),也需要像PCRE那样来显着减少正则表达式。

请注意,此脚本不会改变注释行'// function implementation'。这是你的电话你做了什么。

最后,请记住,如果您编写多个函数来将两个整数相加,则会浪费代码。因此,这不是一个合理的转变。不知何故,每个功能应该做一些不同的事情。当然,如果类型每次都不相同,那么它可能有其用途,但即便如此,编写生成器也比分析骨架并填充位更容易。这可能是一个很好的脚本练习。

+1

您可以使用'[[:blank:]] *'。超级sed('ssed')支持PCRE。另外,你应该指出''sed'不会做多行正则表达式匹配,因为OP试图匹配'///'的LHS上的换行符。你必须使用保持空间和/或分支来编写一个'sed'脚本。我认为“额外”可能是有意的而不是“增加”。 – 2011-03-03 16:11:41

+0

@Dennis:POSIX'sed'确实允许'[[:blank:]]'表示法 - 我在学习之前学会了'sed',所以我倾向于忘记它们。你的换行符只强调了'sed'不是这份工作的正确工具。而你把'addition'解释为'additional'很可能是正确的,并且再次强调'sed'不是工作的工具。所以,我同意你的所有评论。 – 2011-03-03 16:20:33